Как получить уровень защиты для каждого разрешения?
Я пытаюсь перечислить уровень защиты для каждого разрешения в выбранном приложении, для кода, приведенного ниже. Но я не знаю, как это сделать.
ArrayList<String> list_permission = new ArrayList<String>();
String[] reqp = info.requestedPermissions;
if (reqp != null) {
for (i = 0; i < reqp.length; i++) {
k = i + 1;
String a = reqp[i];
if (a.contains("android.permission.")) {
String aa[] = a.split("android.permission.");
list_permission.add(aa[1]);
} else {
list_permission.add(a);
}
}
}
Может ли кто-нибудь помочь мне с этим... просто хочу добавить уровень защиты перед разрешением.
2 ответа
Вы можете использовать метод getPermissionInfo() класса PackageManager, чтобы получить объект PermissionInfo для любого конкретного разрешения. Объект PermissionInfo имеет свойство Protection Lavel, которое можно использовать для проверки уровня защиты любого разрешения... Вы можете проверить его по константе, определенной в классе PermissoinInfo, например PROTECTION_FLAG_SYSTEM
,
Как следующий код:
for (PermissionInfo permission : packageInfo.permissions) {
// Dump permission info
String protectionLevel;
switch(permission.protectionLevel) {
case PermissionInfo.PROTECTION_NORMAL : protectionLevel = "normal"; break;
case PermissionInfo.PROTECTION_DANGEROUS : protectionLevel = "dangerous"; break;
case PermissionInfo.PROTECTION_SIGNATURE : protectionLevel = "signature"; break;
case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM : protectionLevel = "signatureOrSystem"; break;
default : protectionLevel = "<unknown>"; break;
}
Log.i("PermissionCheck", permission.name + " " + protectionLevel);
}
EDIT1:
String a = reqp[i];
if (a.contains("android.permission.")) {
try {
PermissionInfo pi = getPackageManager().getPermissionInfo(a, PackageManager.GET_META_DATA);
String protctionLevel = "unknown";
switch(pi.protectionLevel) {
case PermissionInfo.PROTECTION_NORMAL : protctionLevel = "normal"; break;
case PermissionInfo.PROTECTION_DANGEROUS : protctionLevel = "dangerous"; break;
case PermissionInfo.PROTECTION_SIGNATURE : protctionLevel = "signature"; break;
case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM : protctionLevel = "signatureOrSystem"; break;
case PermissionInfo.PROTECTION_FLAG_SYSTEM : protctionLevel = "system"; break;
default : protctionLevel = "<unknown>"; break;
}
list_permission.add(a+" "+protctionLevel);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
list_permission.add(a);
}
Следующая строка будет работать только на уровне API 16 или выше:
case PermissionInfo.PROTECTION_FLAG_SYSTEM : protctionLevel = "system"; break;
// Получить разрешения для основного пакета Android
PackageInfo packageInfo = getPackageManager().getPackageInfo("android", PackageManager.GET_PERMISSIONS);
if (packageInfo.permissions != null) {
// For each defined permission
for (PermissionInfo permission : packageInfo.permissions) {
// Dump permission info
String protectionLevel;
switch(permission.protectionLevel) {
case PermissionInfo.PROTECTION_NORMAL : protectionLevel = "normal"; break;
case PermissionInfo.PROTECTION_DANGEROUS : protectionLevel = "dangerous"; break;
case PermissionInfo.PROTECTION_SIGNATURE : protectionLevel = "signature"; break;
case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM : protectionLevel = "signatureOrSystem"; break;
default : protectionLevel = "<unknown>"; break;
}
Log.i("PermissionCheck", permission.name + " " + protectionLevel);
}
}