2016-11-24 100 views
2

我想在第一次運行我的應用程序時向用戶詢問所需的所有權限。Android M獲取清單中列出的所有危險權限

但是,我不想在代碼中對Dangerous Permissions進行硬編碼,因爲這會使我的代碼變得不那麼易於管理。

是否有可能在我可以查詢和獲取我在Manifest.xml

+1

你肯定歡迎使用'PackageManager'來找出應用程序請求的權限。我想你也可以找出哪些是危險的。保守地說,這將比應該很少改變的權限的靜態String []更復雜1-2個數量級。 – CommonsWare

回答

3

已經上市作爲CommonsWare在評論中指出所有危險權限的方式,這將是更好地使用所有的一static String[]危險的權限比使用PackageManager得到一個列表。您可以使用下面的方法來讓你的應用程序的危險權限或任何應用程序的列表:

public static List<PermissionInfo> getDangerousPermissions(Context context, String packageName) 
    throws PackageManager.NameNotFoundException { 
    List<PermissionInfo> dangerousPermissions = new ArrayList<>(); 
    PackageManager pm = context.getPackageManager(); 
    PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); 
    if (packageInfo.requestedPermissions != null) { 
    for (String requestedPermission : packageInfo.requestedPermissions) { 
     try { 
     PermissionInfo permissionInfo = pm.getPermissionInfo(requestedPermission, 0); 
     switch (permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) { 
      case PermissionInfo.PROTECTION_DANGEROUS: 
      dangerousPermissions.add(permissionInfo); 
      break; 
     } 
     } catch (PackageManager.NameNotFoundException ignored) { 
     // unknown permission 
     } 
    } 
    } 
    return dangerousPermissions; 
} 

用法示例:

try { 
    List<PermissionInfo> dangerousPermissions = getDangerousPermissions(this, "com.android.chrome"); 
    System.out.println(String.format("%d dangerous permissions:", dangerousPermissions.size())); 
    for (PermissionInfo dangerousPermission : dangerousPermissions) { 
    System.out.println(dangerousPermission.name); 
    } 
} catch (PackageManager.NameNotFoundException e) { 
    e.printStackTrace(); 
} 

輸出:

I/System.out: 7 dangerous permissions: 
I/System.out: android.permission.ACCESS_COARSE_LOCATION 
I/System.out: android.permission.ACCESS_FINE_LOCATION 
I/System.out: android.permission.CAMERA 
I/System.out: android.permission.GET_ACCOUNTS 
I/System.out: android.permission.RECORD_AUDIO 
I/System.out: android.permission.WRITE_EXTERNAL_STORAGE 
I/System.out: android.permission.READ_EXTERNAL_STORAGE