日期: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();
}
下面是效果展示:
這是第一個需要申請的權限
然後是第二個需要申請的權限
全部點擊始終允許後,就可以進入主界面了
如果有點擊禁止的權限,就會出現如下界面,如果選擇設置就會彈出系統設置界面,進行權限設置,如果點擊取消,就會退出程序。
點擊設置後出現如下設置界面
最後,細心的大佬們應該能看出來,我申請了四個權限,卻只有兩個出現在動態申請裏,這說明有另外兩個不需要動態申請,但是我把所有權限都放在動態申請裏也沒有毛病~~
華麗麗的結束了