Skip to content

Instantly share code, notes, and snippets.

@bitter
Created November 15, 2015 20:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bitter/74f36e657adf7d458277 to your computer and use it in GitHub Desktop.
Save bitter/74f36e657adf7d458277 to your computer and use it in GitHub Desktop.
Grant me runtime permissions.
private void grantMeAllDangerousPermissions()
{
if (Build.VERSION.SDK_INT < 23) {
shouldBeOkayToStartTheApplicationNow();
return;
}
try
{
final int PERMISSIONS_REQUEST_CODE = 9613;
// Scan manifest for dangerous permissions not already granted
PackageManager packageManager = getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
if (packageInfo.requestedPermissions == null)
packageInfo.requestedPermissions = new String[0];
final List<String> neededPermissions = new LinkedList<String>();
for (String permission : packageInfo.requestedPermissions) {
PermissionInfo permissionInfo = packageManager.getPermissionInfo(permission, PackageManager.GET_META_DATA);
if (permissionInfo.protectionLevel != PermissionInfo.PROTECTION_DANGEROUS)
continue;
if (checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED)
continue;
neededPermissions.add(permission);
}
// No need to ask for any dangerous permissions
if (neededPermissions.isEmpty()) {
shouldBeOkayToStartTheApplicationNow();
return;
}
final FragmentManager fragmentManager = getFragmentManager();
final Fragment request = new Fragment() {
@Override public void onStart()
{
super.onStart();
requestPermissions(neededPermissions.toArray(new String[0]), PERMISSIONS_REQUEST_CODE);
}
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
if (requestCode != PERMISSIONS_REQUEST_CODE)
return;
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(this);
fragmentTransaction.commit();
shouldBeOkayToStartTheApplicationNow();
}
};
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(0, request);
fragmentTransaction.commit();
}
catch(Exception error)
{
Log.w("MyApplicationTag", String.format("Unable to query for permission: %s", error.getMessage()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment