這可能是最直接的Android動態申請許可權程式碼
阿新 • • 發佈:2018-12-12
隨著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(); } } }