日期:2018.9.10
最近在做一个小项目,使用到了Android权限申请,而且是多个权限申请,我们知道在Android6.0(SDK等级是23)以后有些权限是需要动态申请的,所以也就是申请多个动态权限的问题。
直奔主题,我申请的权限有四个:READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,CAMERA,INTERNET,虽然是动态申请,但是还是需要在AndroidManifest.xml文件中进行静态申请的(特别提示,权限申请要放在application之前):
然后是动态权限申请,第一步:首先声明一个数组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 mPermissionList = new ArrayList<>();
第三步:声明一个请求码,在请求权限的回调方法onRequestPermissionsResult中需要判断使用
private final int mRequestCode = 100;//权限请求码
第四步:这是最重要的一步,进行权限判断和申请,其中的init是我自己程序里的一些初始化,即权限全部申请了,就可以打开程序了。
//4、权限判断和申请
private void initPermission(){
mPermissionList.clear();//清空已经允许的没有通过的权限
//逐个判断是否还有未通过的权限
for (int i = 0;i0){//有权限没有通过,需要申请
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
第六步:不再提示权限时的展示对话框
/**
* 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();
}
下面是效果展示:
这是第一个需要申请的权限
然后是第二个需要申请的权限
全部点击始终允许后,就可以进入主界面了
如果有点击禁止的权限,就会出现如下界面,如果选择设置就会弹出系统设置界面,进行权限设置,如果点击取消,就会退出程序。
点击设置后出现如下设置界面
最后,细心的大佬们应该能看出来,我申请了四个权限,却只有两个出现在动态申请里,这说明有另外两个不需要动态申请,但是我把所有权限都放在动态申请里也没有毛病~~
华丽丽的结束了