1. 程式人生 > >Android6.0執行時許可權-----AndPermission的使用

Android6.0執行時許可權-----AndPermission的使用

最近才開始用AndPermission庫,感覺非常不錯,在使用的過程中,順便就將它的用法寫下來吧。

首先是AndPermission庫的引入,通過新增依賴即可:

dependencies {
    ...compile 'com.yanzhenjie:permission:1.0.4'
}
也可以在Project Strcuture裡搜尋這個依賴庫,直接新增。

然後看他如何判斷是否有某許可權,這裡就用讀簡訊為例,看程式碼:

if(AndPermission.hasPermission(this, Manifest.permission.READ_SMS)){
    //執行業務
}else 
{ //申請許可權 }
這行程式碼的語義感非常強,就是判斷是否有讀取簡訊的許可權,第一個引數是上下文物件 ,在Activity中直接傳入This,這個方法返回一個Boolean型的值,當返回值 為Ture時可以直接執行業務邏輯,當為False時再執行請求使用者極權的邏輯。

接下來看在未獲得許可權時,如何雲請求使用者授權

//申請許可權
AndPermission.with(this)
        .requestCode(100)
        .permission(Manifest.permission.READ_SMS)
        .send();

這裡使用鏈式程式設計,requestCode方法裡面接受一個int值,作為請求碼,用於區分不同的許可權請求,permission方法裡面的引數可以寫一個或多個許可權,中間以逗號隔開而不使用陣列大括號,然後呼叫send方法雲請求許可權。

然後在Activity或Fragment重寫onRequestPermissionsResult方法為當前Activity或Fragment設定監聽回撥,這裡和帶近回值 的Intent需要重寫onActviityResult來設定回撥監聽類,程式碼如下:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
    //只需要呼叫這一句,第一個引數是當前Activity/Fragment,回撥方法寫在當前Activity/Fragment
AndPermission.onRequestPermissionsResult(this,requestCode,permissions,grantResults); }

通過代友我們可以知道,這裡就是將回調監聽傳遞給了AndPermission。

下面我們來看看獲取許可權成功的回撥:

// 成功回撥的方法,用註解即可,裡面的數字是請求時的requestCode。
@PermissionYes(100)
private void getSucceed(List<String> grantedPermissions) {
    // TODO 申請許可權成功。
}

可以看到這裡的實現方法非常巧妙,使用了註解@PermissionYes(100)這裡的100就是申請許可權時的請求碼,用於區分同一個Activity中不同的許可權請求,這樣實現就十分簡潔清晰了。

最後我們來看看獲取許可權失敗的回撥:

// 失敗回撥的方法,用註解即可,裡面的數字是請求時的requestCode。
@PermissionNo(100)
private void getDefeated(List<String> deniedPermissions) {
    // 使用者否勾選了不再提示並且拒絕了許可權,那麼提示使用者到設定中授權。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        // 第一種:用預設的提示語。
AndPermission.defaultSettingDialog(this, 1).show();
}
}

當權限被 使用者拒絕的 時候你可以根據實際情況,可以提示使用者一些功能無法使用,或者直接拒絕使用者進行下一步操作,或者直接良出APP,這裡AndPermission做了一個很好的細節就是當用戶拒絕許可權並且勾選了不再提示時,會預設提示使用者可以雲設定裡面更改設定許可權,並且讓使用者直接跳轉到設定介面去開啟許可權,這裡做的就非常友好了、

下面附錄一個完整的例子,可以梳理一下思路,也可以直接略過:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(AndPermission.hasPermission(this,Manifest.permission.READ_SMS,Manifest.permission.READ_CALENDAR,
Manifest.permission.CAMERA,Manifest.permission.GET_ACCOUNTS,
Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.RECORD_AUDIO,
Manifest.permission.CALL_PHONE,Manifest.permission.BODY_SENSORS,
Manifest.permission.READ_EXTERNAL_STORAGE)){
        //執行業務
}else {
        //申請許可權
AndPermission.with(this)
                .requestCode(100)
                .permission(Manifest.permission.READ_SMS,Manifest.permission.READ_CALENDAR,
Manifest.permission.CAMERA,Manifest.permission.GET_ACCOUNTS,
Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.RECORD_AUDIO,
Manifest.permission.CALL_PHONE,Manifest.permission.BODY_SENSORS,
Manifest.permission.READ_EXTERNAL_STORAGE)
                .send();
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
    //只需要呼叫這一句,第一個引數是當前Activity/Fragment,回撥方法寫在當前Activity/Fragment
AndPermission.onRequestPermissionsResult(this,requestCode,permissions,grantResults);
}
// 成功回撥的方法,用註解即可,裡面的數字是請求時的requestCode。
@PermissionYes(100)
private void getSucceed(List<String> grantedPermissions) {
    // TODO 申請許可權成功。
ToastUtils.showToast(this,"已允許許可權");
}
// 失敗回撥的方法,用註解即可,裡面的數字是請求時的requestCode。
@PermissionNo(100)
private void getDefeated(List<String> deniedPermissions) {
    // 使用者否勾選了不再提示並且拒絕了許可權,那麼提示使用者到設定中授權。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        //用預設的提示語。
AndPermission.defaultSettingDialog(this, 1).show();
}
    ToastUtils.showToast(this,"請設定相關許可權");
}

可以看到執行時許可權無非就是:許可權判斷,許可權申請,授權監聽,有權邏輯,無權提示這五步,程式碼量是比以前增加不少,還好危險許可權相對不多,也可以集中申請,用時判斷;在考慮到Android的每一次進步,都對我們開發者雖然眼前吃點苦,但長期來看也是有很大好處的,也就可以很愉快地接受了這個現實。

這是通過網路上收集寫完的,各位大神如果有好的文章,歡迎推薦,先謝謝大神們了!