Android6.0的許可權系統
阿新 • • 發佈:2018-11-27
Android6.0棉花糖,app將不會在安裝的時候授予許可權。取而代之,app不得不在執行的時候一個一個詢問使用者授予許可權。
下一步,不得不寫個方法檢查是否有許可權。如果沒有就彈出對話方塊詢問使用者許可權
許可權分組了。同一組的任何一個許可權被授權了,其他許可權也自動被授權。原始碼中用來檢查和請求許可權的方法是Activity的checkSelfPermission 和requestPermission。這些方法在api23引入
只有在把 targetSdkVersion 23 以上的版本才會出現。
PROTECTION_NORMAL類許可權
使用者安裝或者更新應用是,系統將授予應用所請求的 PROTECTION_NORMAL的所有許可權(安裝時授予的一類基本許可權)。這類許可權包括:android.permission.ACCESS_LOCATION_EXTRA_COMMANDSandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_NOTIFICATION_POLICY android.permission.ACCESS_WIFI_STATEandroid.permission.ACCESS_WIMAX_STATEandroid.permission.BLUETOOTHandroid.permission.BLUETOOTH_ADMINandroid.permission.BROADCAST_STICKYandroid.permission.CHANGE_NETWORK_STATEandroid.permission.CHANGE_WIFI_MULTICAST_STATEandroid.permission.CHANGE_WIFI_STATEandroid.permission .CHANGE_WIMAX_STATEandroid.permission.DISABLE_KEYGUARDandroid.permission.EXPAND_STATUS_BARandroid.permission.FLASHLIGHTandroid.permission.GET_ACCOUNTSandroid.permission.GET_PACKAGE_SIZEandroid.permission.INTERNETandroid.permission.KILL_BACKGROUND_PROCESSESandroid.permission.MODIFY_AUDIO_SETTINGSandroid .permission.NFCandroid.permission.READ_SYNC_SETTINGSandroid.permission.READ_SYNC_STATSandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.REORDER_TASKSandroid.permission.REQUEST_INSTALL_PACKAGESandroid.permission.SET_TIME_ZONEandroid.permission.SET_WALLPAPERandroid.permission.SET_WALLPAPER_HINTSandroid.permission.SUBSCRIBED_FEEDS_READandroid.permission.TRANSMIT_IRandroid.permission.USE_FINGERPRINTandroid.permission.VIBRATEandroid.permission.WAKE_LOCKandroid.permission.WRITE_SYNC_SETTINGScom.android.alarm.permission.SET_ALARMcom.android.launcher.permission.INSTALL_SHORTCUTcom.android.launcher.permission.UNINSTALL_SHORTCUT
只需要在AndroidManifest.xml中簡單宣告這些許可權就好,安裝時就授權。不需要每次使用時都檢查許可權,而且使用者不能取消以上授權。
讓你的app支援新執行時許可權
首先在AndroidManifest.xml中宣告許可權。下一步,不得不寫個方法檢查是否有許可權。如果沒有就彈出對話方塊詢問使用者許可權
許可權分組了。同一組的任何一個許可權被授權了,其他許可權也自動被授權。原始碼中用來檢查和請求許可權的方法是Activity的checkSelfPermission 和requestPermission。這些方法在api23引入
privatevoidinsertDummyContactWrapper(){ int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);//檢查是否有許可權 if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS}, //請求許可權 這個時候會彈出 允許次許可權的對話方塊
REQUEST_CODE_ASK_PERMISSIONS); return; } insertDummyContact(); }
如果已有許可權,insertDummyContact()
會執行。否則,requestPermissions
被執行來彈出請求授權對話方塊,如下:
不論使用者同意還是拒絕,activity的onRequestPermissionsResult
會被回撥來通知結果(通過第三個引數),grantResults
,如下:
@OverridepublicvoidonRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted 許可權授予
insertDummyContact();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
處理 “不再提醒”
如果使用者拒絕某授權。下一次彈框,使用者會有一個“不再提醒”的選項的來防止app以後繼續請求授權。如果這個選項在拒絕授權前被使用者勾選了。下次為這個許可權請求requestPermissions
時,對話方塊就不彈出來了,結果就是,app啥都不幹。
這將是很差的使用者體驗,使用者做了操作卻得不到響應。這種情況需要好好處理一下。在請求requestPermissions
前,我們需要檢查是否需要展示請求許可權的提示通過activity的
shouldShowRequestPermissionRationale
,程式碼如下:
finalprivateint REQUEST_CODE_ASK_PERMISSIONS = 123;
privatevoidinsertDummyContactWrapper(){
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener() {
@OverridepublicvoidonClick(DialogInterface dialog, int which){
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
}
});
return;
}
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
insertDummyContact();
}
privatevoidshowMessageOKCancel(String message, DialogInterface.OnClickListener okListener){
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
當一個許可權第一次被請求和使用者標記過不再提醒的時候,我們寫的對話方塊被展示。
後一種情況,onRequestPermissionsResult 會收到PERMISSION_DENIED ,系統詢問對話方塊不展示。