Android:检查是否必须询问运行时权限
我想检查一个特定的应用程序是否需要在运行时处理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
/**
* 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
检查权限。如果没有许可,请请求许可。