天天看点

Android版本适配总结——6.01. Android Marshmallow 6.0(23)适配

1. Android Marshmallow 6.0(23)适配

1.1 动态权限适配

1.1.1 危险权限列表(Dangerous Permission)

Android版本适配总结——6.01. Android Marshmallow 6.0(23)适配

以上权限,当targetSdkVersion大于等于23时,需要动态获取权限。同一组的任何一个权限被授权了,其他权限也自动被授权。

1.1.2 动态获取权限

以Android Studio 为例,为了兼容23之前,使用v4兼容库,使用ContextCompat等。

  1. AndroidManifest中声明权限。
  2. 在build.gradle中设置targetSdkVersion为23及以上
android {
    compileSdkVersion 23
    buildToolsVersion '25.0.3'
    defaultConfig {
        minSdkVersion 19  // 4.4
        targetSdkVersion 23 // 6.0
    }
}
           
  1. 检查并申请权限
//这里以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
}
           
  1. 接收回调

    不论用户是否赋予权限,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);
    }
}
           
  1. 不在提醒

    如果用户拒绝某授权。下一次弹框,用户会有一个“不再提醒”的选项的来防止app以后继续请求授权。为了防止不在请求权限,我们可以在请求requestPermissions前,我们需要检查是否需要展示请求权限的提示通过activity的shouldShowRequestPermissionRationale

if (!ActivityCompat.shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION){
     //显示我们自己的获取全下提示框
}
           
  1. 一次获取多个权限

参考

  1. Android M 新的运行时权限开发者需要知道的一切