3

我想检查一个特定的应用程序是否需要在运行时处理 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 |
====================   

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

4

3 回答 3

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 |
====================
于 2016-05-27T12:54:33.390 回答
1

我您的活动检查是否(API 版本 >= 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;
    }
}
于 2016-05-27T11:38:51.930 回答
0

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

于 2016-05-27T11:50:07.297 回答