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