Reputation: 36289
I am trying to gain access to the list of Permissions in Manifest.permission, which is a final class. How do I gain access to its declared String values?
Upvotes: 0
Views: 353
Reputation: 15205
Taken literally, I believe the question is about how to simply get the list of POSSIBLE permissions, not the runtime permissions on a package. Assuming that's true, this is simply a reflection question.
You would do something like this (not compiled):
List<Field> permissionFields = new ArrayList<Field>();
Field[] fields = Manifest.permission.class.getDeclaredFields();
for (Field declField : fields) {
if ((declField.getType() == String.class) && Modifier.isFinal(declField.getModifiers())) {
permissionFields.add(declField);
}
}
The "permissionFields" list holds the list of objects that are permission values. You can use the "Field.getObject(obj)" method to get the String value (curiously, there doesn't appear to be a "Field.getString(obj)" method, although there are several other "Field.get(obj)" methods (perhaps because String isn't a primitive)).
Upvotes: 2
Reputation: 20936
Here is the code:
Log.d(TAG, "Getting permissions for " + packageName);
try {
PackageInfo pkgInfo = getPackageManager().getPackageInfo(
packageName,
PackageManager.GET_PERMISSIONS
);
PermissionInfo[] permissions = pkgInfo.permissions;
if (permissions == null) {
permissionsField.setText("No declared permissions");
}
else {
String permissionsText = "";
for (int i = 0; i < permissions.length; i++) {
switch (permissions[i].protectionLevel) {
case 0:
permissionsText += permissions[i].name + ":::" + "NORMAL" + "\n";
break;
case 1:
permissionsText += permissions[i].name + ":::" + "DANGEROUS" + "\n";
break;
case 2:
permissionsText += permissions[i].name + ":::" + "SIGNATURE" + "\n";
break;
case 3:
permissionsText += permissions[i].name + ":::" + "SIGNATUREORSYSTEM" + "\n";
break;
}
}
permissionsField.setText(permissionsText);
}
String[] requestedPermissions = pkgInfo.requestedPermissions;
if (requestedPermissions == null) {
requestedPermissionsField.setText("No requested permissions");
}
else {
String reqPermText = "";
for (int i = 0; i < requestedPermissions.length; i++) {
reqPermText += requestedPermissions[i] + "\n";
}
requestedPermissionsField.setText(reqPermText);
}
}
catch (PackageManager.NameNotFoundException e) {
permissionsField.setText("Package Not Found");
requestedPermissionsField.setText("Package Not Found");
}
Upvotes: 0