1. 程式人生 > >Android6.0 動態許可權獲取記錄

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