Android:检查是否必须询问运行时权限

时间:2016-05-27 11:28:00

标签: android android-6.0-marshmallow runtime-permissions

我想检查特定应用是否需要在运行时处理Android Marshmallow运行时权限。

以下假设是否正确?

/**
 * Checks whether runtime permissions must be handled or not.
 *
 * @param context Application context.
 * @return Handle runtime permissions or not.
 */
public static boolean shouldCheckRuntimePermissions(Context context) {
    return
            isApplicationWithMarshmallowTargetSdkVersion(context) &&
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}

/**
 * Checks whether the app is compiled with targetSdkVersion Marshmallow or above.
 *
 * @param context Application context.
 * @return Application targetSdkVersion above 23 or not.
 */
public static boolean isApplicationWithMarshmallowTargetSdkVersion(Context context) {
    return
            context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}

以下是我详细说明的表格,例如需要ACCESS_COARSE_LOCATION权限才能向用户询问Android Marshmallow运行时权限。

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================   

我知道支持库helpers的存在,但我想在这种特殊情况下避免使用它们。

3 个答案:

答案 0 :(得分:3)

@LuisMiguelSierra是对的,我在问题结尾处发布的链接中得到了答案,我根本没有意识到。以下是回答我的问题并确认我的假设和方法是正确的引用:

  

在所有Android版本上,您的应用都需要声明正常   以及它在应用程序清单中需要的危险权限   在声明权限中描述。但是,效果呢   声明因系统版本和您的而异   应用的目标SDK级别:

     
      
  • 如果设备运行的是Android 5.1或更低版本,或者您应用的目标SDK是22或更低:如果您列出了危险权限   清单,用户在安装时必须授予权限   应用;如果他们不授予权限,则系统不会安装   应用程序。
  •   
  • 如果设备运行的是Android 6.0或更高版本,并且您应用的目标SDK为23或更高:应用必须列出权限   清单,它必须要求每个危险的许可   应用程序运行时需要。用户可以授予或拒绝每个   权限,应用程序可以继续以有限的方式运行   功能即使用户拒绝权限请求也是如此。
  •   

所以这个关于何时询问权限的假设得到了确认:

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================

答案 1 :(得分:1)

我的活动检查是否(API版本&gt; = 23并且权限被拒绝)然后请求权限

if (android.os.Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}

要获得用户的结果,只需覆盖

 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_LOCATION_PERMISSION:
             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG,"Premission granted");
             }else {
                    Log.d(TAG,"Premission denied");
             }
             break;
    }
}

答案 2 :(得分:0)

您可以尝试使用Google Samples中的EasyPermissions库。它处理与权限相关的检查,您无需担心检查版本。