1. 程式人生 > >Android6.0的許可權系統

Android6.0的許可權系統

Android6.0棉花糖,app將不會在安裝的時候授予許可權。取而代之,app不得不在執行的時候一個一個詢問使用者授予許可權。

只有在把 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 ,系統詢問對話方塊不展示。


轉載 http://www.jianshu.com/p/e1ab1a179fbb