1. 程式人生 > >Android 6.0許可權請求相關及許可權分組

Android 6.0許可權請求相關及許可權分組

Android M(6.0)API 23後加入了許可權請求設定,APP需要使用某些許可權需要主動申請。

許可權分為3類,一組是Normal許可權,無需申請,另一組是Dangerous,需申請,然後是特殊許可權,需申請。

先看下Normal許可權列表:


再看下Dangerous許可權列表:

危險許可權實際上才是執行時許可權主要處理的物件,這些許可權可能引起隱私問題或者影響其他程式執行。Android中的危險許可權可以歸為以下幾個分組:

CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
各個許可權分組與其具體的許可權,可以參考下圖:


想要不支援執行時許可權機制很簡單,只需要將targetSdkVersion設定低於23就可以了,意思是告訴系統,我還沒有完全在API 23(6.0)上完全搞定,不要給我啟動新的特性。

特殊許可權:

就是一些特別敏感的許可權,在Android系統中,主要由兩個

  • SYSTEM_ALERT_WINDOW,設定懸浮窗,進行一些黑科技
  • WRITE_SETTINGS 修改系統設定

關於上面兩個特殊許可權的授權,做法是使用startActivityForResult啟動授權介面來完成。

請求SYSTEM_ALERT_WINDOW

private static final int REQUEST_CODE = 1;
private  void requestAlertWindowPermission() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            Log.i(LOGTAG, "onActivityResult granted");
        }
    }
}
上述程式碼需要注意的是

  • 使用Action Settings.ACTION_MANAGE_OVERLAY_PERMISSION啟動隱式Intent
  • 使用"package:" + getPackageName()攜帶App的包名資訊
  • 使用Settings.canDrawOverlays方法判斷授權結果

請求WRITE_SETTINGS

private static final int REQUEST_CODE_WRITE_SETTINGS = 2;
private void requestWriteSettings() {
    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_WRITE_SETTINGS) {
        if (Settings.System.canWrite(this)) {
            Log.i(LOGTAG, "onActivityResult write settings granted" );
        }
    }
}
上述程式碼需要注意的是

  • 使用Action Settings.ACTION_MANAGE_WRITE_SETTINGS 啟動隱式Intent
  • 使用"package:" + getPackageName()攜帶App的包名資訊
  • 使用Settings.System.canWrite方法檢測授權結果
注意:關於這兩個特殊許可權,一般不建議應用申請。
其實你不需要每個許可權都去顯式申請,舉一個例子,如果你的應用授權了讀取聯絡人的許可權,那麼你的應用也是被賦予了寫入聯絡人的許可權。因為讀取聯絡人和寫入聯絡人這兩個許可權都屬於聯絡人許可權分組,所以一旦組內某個許可權被允許,該組的其他許可權也是被允許的。