Android6.0 動態權限獲取記錄

        這應該算是一個比較老的東西了,但還是想寫一寫。

        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  動態權限獲取已經完成了,不算麻煩,最主要的還是看能不能解決碎片化導致的各個廠商不同的動態權限獲取問題。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章