天天看點

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 新的運作時權限開發者需要知道的一切