每日一記—Android動態申請多個許可權
日期:2018.9.10
最近在做一個小專案,使用到了Android許可權申請,而且是多個許可權申請,我們知道在Android6.0(SDK等級是23)以後有些許可權是需要動態申請的,所以也就是申請多個動態許可權的問題。
直奔主題,我申請的許可權有四個:READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,CAMERA,INTERNET,雖然是動態申請,但是還是需要在AndroidManifest.xml檔案中進行靜態申請的(特別提示,許可權申請要放在application之前):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET"/>
然後是動態許可權申請,第一步:首先宣告一個數組permissions,將所有需要申請的許可權都放在裡面
//1、首先宣告一個數組permissions,將所有需要申請的許可權都放在裡面 String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET};
第二步:建立一個mPermissionList,逐個判斷哪些許可權未授權,將未授權的許可權儲存到mPermissionList中
List<String> mPermissionList = new ArrayList<>();
第三步:宣告一個請求碼,在請求許可權的回撥方法onRequestPermissionsResult中需要判斷使用
private final int mRequestCode = 100;//許可權請求碼
第四步:這是最重要的一步,進行許可權判斷和申請,其中的init是我自己程式裡的一些初始化,即許可權全部申請了,就可以開啟程式了。
//4、許可權判斷和申請 private void initPermission(){ mPermissionList.clear();//清空已經允許的沒有通過的許可權 //逐個判斷是否還有未通過的許可權 for (int i = 0;i<permissions.length;i++){ if (ContextCompat.checkSelfPermission(this,permissions[i])!= PackageManager.PERMISSION_GRANTED){ mPermissionList.add(permissions[i]);//新增還未授予的許可權到mPermissionList中 } } //申請許可權 if (mPermissionList.size()>0){//有許可權沒有通過,需要申請 ActivityCompat.requestPermissions(this,permissions,mRequestCode); }else { //許可權已經都通過了,可以將程式繼續打開了 init(); } }
第五步:請求許可權後回撥的方法,這步是在許可權請求完成後做個判斷,是否完成了所有許可權的申請,如果有沒有同意的許可權申請,自動跳轉到系統設定介面或者退出,注意這裡我也使用了一次init,目的是如果是第四步中的mPermissionList.size()>0,那麼將不會執行第四步裡的init(),也就是不會開啟程式,而是卡在了申請許可權的介面。
/**
* 5.請求許可權後回撥的方法
* @param requestCode 是我們自己定義的許可權請求碼
* @param permissions 是我們請求的許可權名稱陣列
* @param grantResults 是我們在彈出頁面後是否允許許可權的標識陣列,陣列的長度對應的是許可權
* 名稱陣列的長度,陣列的資料0表示允許許可權,-1表示我們點選了禁止許可權
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean hasPermissionDismiss = false;//有許可權沒有通過
if (mRequestCode==requestCode){
for (int i=0;i<grantResults.length;i++){
if (grantResults[i]==-1){
hasPermissionDismiss=true;
break;
}
}
}
if (hasPermissionDismiss){//如果有沒有被允許的許可權
showPermissionDialog();
}else {
//許可權已經都通過了,可以將程式繼續打開了
init();
}
}
第六步:不再提示許可權時的展示對話方塊
/**
* 6.不再提示許可權時的展示對話方塊
*/
AlertDialog mPermissionDialog;
String mPackName = "crazystudy.com.crazystudy";
private void showPermissionDialog() {
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(this)
.setMessage("已禁用許可權,請手動授予")
.setPositiveButton("設定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
Uri packageURI = Uri.parse("package:" + mPackName);
Intent intent = new Intent(Settings.
ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//關閉頁面或者做其他操作
cancelPermissionDialog();
SplashActivity.this.finish();
}
})
.create();
}
mPermissionDialog.show();
}
第七步:關閉對話方塊
private void cancelPermissionDialog() {
mPermissionDialog.cancel();
}
下面是效果展示:
這是第一個需要申請的許可權
然後是第二個需要申請的許可權
全部點選始終允許後,就可以進入主介面了
如果有點選禁止的許可權,就會出現如下介面,如果選擇設定就會彈出系統設定介面,進行許可權設定,如果點選取消,就會退出程式。
點選設定後出現如下設定介面
最後,細心的大佬們應該能看出來,我申請了四個許可權,卻只有兩個出現在動態申請裡,這說明有另外兩個不需要動態申請,但是我把所有許可權都放在動態申請裡也沒有毛病~~
華麗麗的結束了