Reputation: 3208
I want to get all granted permissions. I know I can get all requested permissions by packageinfo.requestedPermissions
but I want to know list of granted permissions and granted permissions can be lesser then requested in case of android M. So I just wanted to know that is there way that I can get list of all granted permissions?
I know from list of requested permission I can check for that permission weather granted or not but I want to know list of all granted permission. Don't want to check for every requested permission.
Upvotes: 14
Views: 13685
Reputation: 2301
I am also needed to know which permissions are granted by user and which are not for particular package. So below the function I have used to get that permission list.
Java
private Map<String, List<String>> getAppPermissionsList(String packageName) {
List<String> granted = new ArrayList<>();
List<String> denied = new ArrayList<>();
try {
PackageInfo pi = getPackageManager().getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS);
for (int i = 0; i < pi.requestedPermissions.length; i++) {
if ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
granted.add(pi.requestedPermissions[i]);
}else {
denied.add(pi.requestedPermissions[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
Map<String, List<String>> map = new HashMap<>();
map.put("granted", granted);
map.put("denied", denied);
return map;
}
Kotlin
private fun getAppPermissionsList(appPackage: String): Map<String, List<String>>? {
val granted: MutableList<String> = ArrayList()
val denied: MutableList<String> = ArrayList()
try {
val pi = packageManager.getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS)
for (i in pi.requestedPermissions.indices) {
if (pi.requestedPermissionsFlags[i] and PackageInfo.REQUESTED_PERMISSION_GRANTED != 0) {
granted.add(pi.requestedPermissions[i])
} else {
denied.add(pi.requestedPermissions[i])
}
}
} catch (e: Exception) {
e.printStackTrace()
}
val map: MutableMap<String, List<String>> = HashMap()
map["granted"] = granted
map["denied"] = denied
return map
}
Upvotes: 0
Reputation: 58507
A simple function that returns all the permissions that have been requested and granted for a given package could look like this:
List<String> getGrantedPermissions(final String appPackage) {
List<String> granted = new ArrayList<String>();
try {
PackageInfo pi = getPackageManager().getPackageInfo(appPackage, PackageManager.GET_PERMISSIONS);
for (int i = 0; i < pi.requestedPermissions.length; i++) {
if ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) {
granted.add(pi.requestedPermissions[i]);
}
}
} catch (Exception e) {
}
return granted;
}
Note that this requires API level 16 or above, but that should hopefully not be an issue these days.
Upvotes: 36
Reputation: 965
You can check permission one by one and add to list:
// Should we show an explanation?
List<String> listPermissionsNeeded = new ArrayList<>();
// No explanation needed, we can request the permission.
if((ContextCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED))
{
listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if((ContextCompat.checkSelfPermission(context,
Manifest.permission.GET_ACCOUNTS)
!= PackageManager.PERMISSION_GRANTED))
{
listPermissionsNeeded.add(Manifest.permission.GET_ACCOUNTS);
}
if((ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED))
{
listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if((ContextCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED))
{
listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if((ContextCompat.checkSelfPermission(context,
Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED))
{
listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(context,
listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
MY_PERMISSIONS_REQUEST_MULTIPLE_PERMISSION);
}
Upvotes: -3