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

Android:检查是否必须询问运行时权限,android,android-6.0-marshmallow,runtime-permissions,Android,Android 6.0 Marshmallow,Runtime Permissions,我想检查一个特定的应用程序是否需要在运行时处理Android棉花糖运行时权限 以下假设正确吗 /** * Checks whether runtime permissions must be handled or not. * * @param context Application context. * @return Handle runtime permissions or not. */ public static boolean shouldCheckRuntimePermi

我想检查一个特定的应用程序是否需要在运行时处理Android棉花糖运行时权限

以下假设正确吗

/**
 * 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\u rough\u LOCATION
权限才能向具有Android棉花糖运行时权限的用户发出请求

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================   
====================
目标SDK |I检查您的活动是否(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;
    }
}

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

@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 |
====================
====================

target SDK |我认为您只需要检查构建SDK版本,因为目标版本只表明了您在开发时瞄准的SDK。@LuisMiguelSierra我不这么认为,如果您使用targetSDK 23和OS SDK 22运行应用程序,则无需询问运行时权限。至少这是我在危险地点测试过的。你的假设听起来不错。工作正常吗?@GoRoS是的,你说得对。这里解释了targetSDK、buildSDK和运行时权限之间的关系。如果你想到Android支持不实现运行时许可的旧应用,这对我来说是有意义的。我只是没想过。我们现在明白了。嗨,Abanoub,1)我不想知道如何申请运行时权限,因为我发布了2)读了我最后一句话,我说我不想使用支持库。嗨,jaibatrik,谢谢你的回答。我已经知道这个示例,但我只是想了解“何时提问”的逻辑,而不是“如何提问”,以及我的假设是否正确。如果SDK版本低于M,您无需检查权限,只需在清单中声明即可。如果等于或大于M,请使用
上下文#checkPermission
检查权限。如果没有许可,请请求许可。