我想检查特定应用是否需要在运行时处理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的存在,但我想在这种特殊情况下避免使用它们。
答案 0 :(得分:3)
在所有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库。它处理与权限相关的检查,您无需担心检查版本。