1. 程式人生 > >Android6.0 申請許可權比較優雅的處理方法

Android6.0 申請許可權比較優雅的處理方法

android6.0以後許可權的申請改成了動態申請,如果你的targetSdkVersion 大於23且手機系統是6.0以上的就會變成動態申請.為了專案的需求我自己整理了一套許可權申請的方法.先上幾張圖片.
1.這是我第一次執行專案彈出許可權請求的介面,我都選擇了不允許,然後會通過Snackbar友好的提醒使用者需要允許許可權

2.當我第二次在點選拍照時,就會先彈出一個Snackbar告訴使用者,我需要一些許可權,這次我還是決絕而且還點選了不再提醒.這樣使用者下次在點選拍照時就無法彈出申請許可權的介面了,這裡我就通過Snackbar提醒使用者是否要去設定介面開啟許可權

3.這是我選擇了不再詢問以後再次點選拍照的時候,這時就會直接彈出Snackbar提醒使用者是否要去設定介面開啟許可權

通過上面的圖片效果,應該可以看出這套許可權請求的過程了,下面我就貼一下程式碼.
1.我把許可權請求封裝到了一個工具類中,程式碼如下
`public class PermissionUtil {

/**
 * 檢測許可權
 * @param activity
 * @param view //隨便一個view 來用顯示snackbar
 * @param permissions  //請求的許可權組
 * @param requestCode  //請求碼
 */
public  static void checkPermission(final Activity activity,View view, final String[] permissions, final int requestCode,permissionInterface permissionInterface) {
    //小於23 就什麼都不做
    if (Build.VERSION.SDK_INT < 23) {
        return;
    }
    List<String> deniedPermissions = findDeniedPermissions(activity, permissions);
    if (deniedPermissions!=null&&deniedPermissions.size()>0) {
        //大於0,表示有許可權沒申請
        PermissionUtil.requestContactsPermissions(activity, view,  deniedPermissions.toArray(new String[deniedPermissions.size()]), requestCode);
    } else {
        //擁有許可權
        permissionInterface.success();

    }
}

/**
 * 請求許可權
 */
public static void requestContactsPermissions(final Activity activity,View view, final String[] permissions, final int requestCode) {
    //預設是false,但是隻要請求過一次許可權就會為true,除非點了不再詢問才會重新變為false
    if (shouldShowPermissions(activity,permissions)) {

        Snackbar.make(view, "需要一些許可權",
                Snackbar.LENGTH_INDEFINITE)
                .setAction("確定", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        ActivityCompat
                                .requestPermissions(activity, permissions,
                                        requestCode);
                    }
                })
                .show();
    } else {

        // 無需向用戶介面提示,直接請求許可權,如果使用者點了不再詢問,即使呼叫請求許可權也不會出現請求許可權的對話方塊
        ActivityCompat.requestPermissions(activity,
                permissions,
                requestCode);
    }
}

/**
 * 判斷請求許可權是否成功
 * @param grantResults
 * @return
 */
public static boolean verifyPermissions(int[] grantResults) {
    // At least one result must be checked.
    if(grantResults.length < 1){
        return false;
    }

    // Verify that each required permission has been granted, otherwise return false.
    for (int result : grantResults) {
        if (result != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

//回撥介面
public interface permissionInterface{
    void success();
}
/**
 * 找到沒有授權的許可權
 * @param activity
 * @param permission
 * @return
 */
public static List<String> findDeniedPermissions(Activity activity, String... permission)
{
    //儲存沒有授權的許可權
    List<String> denyPermissions = new ArrayList<>();
    for (String value : permission)
    {
        if (ContextCompat.checkSelfPermission(activity,value) != PackageManager.PERMISSION_GRANTED)
        {
            //沒有許可權 就新增
            denyPermissions.add(value);
        }
    }
    return denyPermissions;
}

/**
 * 檢測這些許可權中是否有 沒有授權需要提示的
 * @param activity
 * @param permission
 * @return
 */
public static boolean shouldShowPermissions(Activity activity, String... permission)
{

    for (String value : permission)
    {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
                value))
        {
           return true;
        }
    }
    return false;
}

}`
2.下面在貼一下使用的程式碼

在需要許可權請求的地方呼叫如下方法就可以開啟許可權請求
  /**
     * 請求拍照的許可權
     * 第二個引數表示一個view ,可以隨便傳入一個
     * 第三個表示 請求的許可權陣列
     * 第4個是請求碼
     * 第5個是回撥介面
     */
    private void requestPermiss() {
        PermissionUtil.checkPermission(getmActivity(), linearAddbankcard2Bankcard, REQUEST_PERMISSIONS, REQUEST_PERMISSION_CODE_TAKE_PIC, new
PermissionUtil.permissionInterface() { @Override public void success() { UtilMethod.paizhao(getmActivity(), Constants.PHOTOHRAPH); } }); } 但是還得需要重寫下面的方法來判斷許可權是否開啟成功,並且做相應的處理 /** * 檢測許可權的回撥 * * @param requestCode * @param permissions * @param grantResults */ public void onRequestPermissionsResult(int requestCode, final String[] permissions, int[] grantResults) { if (requestCode == REQUEST_PERMISSION_CODE_TAKE_PIC) { if (PermissionUtil.verifyPermissions(grantResults)) {//有許可權 ImageTools.paizhao(getmActivity(), Constants.PHOTOHRAPH); } else { //沒有許可權 if (!PermissionUtil.shouldShowPermissions(this,permissions)) {//這個返回false 表示勾選了不再提示 showSnackBar(linearAddbankcard2Bankcard, "請去設定介面設定許可權","去設定"); } else { //表示沒有許可權 ,但是沒勾選不再提示 showSnackBar(linearAddbankcard2Bankcard, "請允許許可權請求!"); } } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } 重寫下面的方法為了判斷, 使用者去設定介面是否開啟了許可權 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //如果是從設定介面返回,就繼續判斷許可權 if (requestCode == REQUEST_PERMISSION_SEETING) { requestPermiss(); } }

3.這時去設定介面的程式碼

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivityForResult(intent, REQUEST_PERMISSION_SEETING);

4.最後提點小建議,最好在申請許可權的程式碼用try catch 住,防止有些廠家修改了系統出現未知的BUG,為了方便使用,我封裝了一個請求許可權的庫,使用非常簡單, 一行呼叫程式碼即可.具體的參考請求許可權的庫