1. Android Marshmallow 6.0(23)适配
1.1 动态权限适配
1.1.1 危险权限列表(Dangerous Permission)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSPBpWT3VkeYVTNtJWMONDTwYVbiVHNHpleO1GTulzRilWO5xkNNh0YwIFSh9Fd4VGdsATMfd3bkFGazxyaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cWZwpmL4YTNzMDMzcTMwEjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
以上权限,当targetSdkVersion大于等于23时,需要动态获取权限。同一组的任何一个权限被授权了,其他权限也自动被授权。
1.1.2 动态获取权限
以Android Studio 为例,为了兼容23之前,使用v4兼容库,使用ContextCompat等。
- AndroidManifest中声明权限。
- 在build.gradle中设置targetSdkVersion为23及以上
android {
compileSdkVersion 23
buildToolsVersion '25.0.3'
defaultConfig {
minSdkVersion 19 // 4.4
targetSdkVersion 23 // 6.0
}
}
- 检查并申请权限
//这里以ACCESS_COARSE_LOCATION为例,检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//申请权限
ActivityCompat.requestPermissions(this, new String[{Manifest.permission.ACCESS_COARSE_LOCATION}, WRITE_COARSE_LOCATION_REQUEST_CODE);//自定义的code
}
-
接收回调
不论用户是否赋予权限,activity的 onRequestPermissionsResult方法都会回调。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case WRITE_COARSE_LOCATION_REQUEST_CODE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Permission Granted
// TODO
} else { // Permission Denied
Toast.makeText(Activity.this, "ACCESS_COARSE_LOCATION Denied", Toast.LENGTH_SHORT).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
-
不在提醒
如果用户拒绝某授权。下一次弹框,用户会有一个“不再提醒”的选项的来防止app以后继续请求授权。为了防止不在请求权限,我们可以在请求requestPermissions前,我们需要检查是否需要展示请求权限的提示通过activity的shouldShowRequestPermissionRationale
if (!ActivityCompat.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION){
//显示我们自己的获取全下提示框
}
- 一次获取多个权限
参考
- Android M 新的运行时权限开发者需要知道的一切