這應該算是一個比較老的東西了,但還是想寫一寫。
Android6.0 動態權限,顧名思義,是在6.0及以上的Android生效的,6.0以下,及小米,魅族等自定義的權限獲取,相對來說比較複雜,網上看了很多文章,有很多種不同的實現方法,但個人感覺都不太可靠,主要還是Android碎片化太嚴重。下面先附上幾個解決6.0一下及國內相關廠商自定義權限獲取的方案:
AppOpsManager權限檢測適配:https://www.jianshu.com/p/352c4b9d320d
Android AppOpsManager權限判斷:https://www.jianshu.com/p/5fa0a149926d?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation
Android 5.1 AppOps總結:https://blog.csdn.net/lewif/article/details/49124757
小米魅族系統遇到的6.0權限不彈窗問題:https://blog.csdn.net/hey_xiaoge/article/details/56017363
小米6.0動態權限特殊處理:https://blog.csdn.net/jsqfengbao/article/details/77185983
以上幾個大概都是使用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 動態權限獲取已經完成了,不算麻煩,最主要的還是看能不能解決碎片化導致的各個廠商不同的動態權限獲取問題。