1. 程式人生 > >這可能是最直接的Android動態申請許可權程式碼

這可能是最直接的Android動態申請許可權程式碼

隨著SDK版本的升級。Android程式設計師避免不了需要把 targetSdkVersion 設定為>=23  這就避免不了涉及到動態申請許可權。

如果需要看理論的知識 請搜尋其它文章。如果想直接書寫程式碼和解決方式。請繼續:

當 targetSdkVersion 設定為>=23時候。設定動態申請許可權程式碼如下。本人以配置高德定位為例。你可根據自己業務場景修改相關需要許可權即可:

1、把你需要的許可權靜態配置在AndroidManifest.xml檔案裡。。Android 開發人員都懂。。

如圖:

2、首先定義需要的變數

/**
  * 需要進行檢測的許可權陣列,這是定位需要的。。其它的請自行修改
  */
 protected String[] totalPermissions = {
         Manifest.permission.ACCESS_COARSE_LOCATION,
         Manifest.permission.ACCESS_FINE_LOCATION,
         Manifest.permission.WRITE_EXTERNAL_STORAGE,
         Manifest.permission.READ_EXTERNAL_STORAGE,
         Manifest.permission.READ_PHONE_STATE
 };
 //檢驗完成。未獲得許可權的資料
 private List<String> needPermissions=new ArrayList<>();
//申請許可權的回撥碼
 final int  REQUEST_CODE=1;

3、程式碼檢查許可權。如果全部已經有了執行的操作和沒有 去申請。注意 這是activity和fragment裡申請方法不同。要區分。下面有標識

//清空沒授權陣列
needPermissions.clear();
//遍歷需要申請陣列。哪個沒有授權。單獨新增
for(int i=0;i<totalPermissions.length;i++){
    if(ContextCompat.checkSelfPermission(RequestPerssionActivity.this,totalPermissions[i])!= PackageManager.PERMISSION_GRANTED){
        needPermissions.add(totalPermissions[i]);
    }
}
//如果有未授權陣列。單獨申請。否則 認為 全部 有許可權。。直接進行操作
if(needPermissions.size()>0){
    String[] strings = new String[needPermissions.size()];
    needPermissions.toArray(strings);
    //這是activity裡面申請的方法
    ActivityCompat.requestPermissions(this,strings,REQUEST_CODE);
    //注意如果是Framgnet裡面申請。要用如下方法。否則回撥方法會進入到activity  而不是Fragment。其它地方程式碼不變
    //fragment.this.requestPermissions(strings,REQUEST_CODE);
}else{//說明有所有許可權。。想做啥直接做吧
    //自定義的發起定位的方法,,請改為你自己想要執行的操作
    location.StartMapLocation();
}

4、定義動態申請的回撥方法

/**
 * 相關許可權請求 回撥
 *
 * @param requestCode
 * @param permissions
 * @param paramArrayOfInt
 */
@TargetApi(23)
public void onRequestPermissionsResult(int requestCode,
                                       String[] permissions, int[] paramArrayOfInt) {
    if(requestCode==REQUEST_CODE){//許可權回撥成功。並且允許的許可權和申請的許可權數目上相等。直接執行想要的操作
        int tag=0;
        for(int i=0;i<paramArrayOfInt.length;i++){
            if(paramArrayOfInt[i]== PackageManager.PERMISSION_GRANTED){
                tag++;
            }
        }
        if(tag==needPermissions.size()){
            //自定義的發起 定位的方法,請改為你自己想要執行的操作
            location.StartMapLocation();
        }

    }
}