Android6.0 動態許可權獲取記錄
這應該算是一個比較老的東西了,但還是想寫一寫。
Android6.0 動態許可權,顧名思義,是在6.0及以上的Android生效的,6.0以下,及小米,魅族等自定義的許可權獲取,相對來說比較複雜,網上看了很多文章,有很多種不同的實現方法,但個人感覺都不太可靠,主要還是Android碎片化太嚴重。下面先附上幾個解決6.0一下及國內相關廠商自定義許可權獲取的方案:
以上幾個大概都是使用AppOpsManager來解決問題,後面還看到過一個說申請許可權後通過判斷是否跳轉其他介面的方法,來確定是否有許可權的方法,大家可以參考一下。下面還是介紹一下Google官方支援的6.0許可權獲取步驟吧。
在6.0以後的系統中,並不是所有許可權都需要動態獲取,只有在以下表中的危險許可權才需要動態獲取:
group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR group:android.permission-group.CAMERA permission:android.permission.CAMERA group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
然後確保你的targetSdkVersion >= 23,然後在清單檔案中如往常開發申請許可權一樣,申明你所需要的許可權,包括危險許可權和普通許可權:
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.CAMERA" />
申請許可權的程式碼,大致可以分為3步:
1、檢查你需要的許可權是否已經授權 ContextCompat.checkSelfPermission() :
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
...
} else {
...
}
}
2、動態申請許可權 ActivityCompat.requestPermissions():
if(Build.VERSION.SDK_INT>=23){
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
...
}
}
requestPermissions()方法接收三個引數,分別是Activity的例項、需要申請許可權的String陣列、請求碼,請求碼在第三步會用到。
3、重寫許可權申請之後的回撥方法 onRequestPermissionsResult() :
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//grantResults陣列與許可權字串陣列對應,裡面存放許可權申請結果
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"已授權",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"拒絕授權",Toast.LENGTH_SHORT).show();
}
}
好了,到此基本的Android6.0 動態許可權獲取已經完成了,不算麻煩,最主要的還是看能不能解決碎片化導致的各個廠商不同的動態許可權獲取問題。