Android动态申请多个权限-非第三方框架
Posted Jason_Lee155
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动态申请多个权限-非第三方框架相关的知识,希望对你有一定的参考价值。
最近在做一个项目,需要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 = 0x10;//权限请求码
第四步:这是最重要的一步,进行权限判断和申请,其中的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){//如果有没有被允许的权限
showWaringDialog();
}else {
//权限已经都通过了,可以将程序继续打开了
init();
}
}
第六步:不再提示权限时的展示对话框:
/**
* 警告弹窗
*/
private void showWaringDialog() {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("警告!")
.setMessage("请前往设置->应用->phone->权限中打开相关权限,否则功能无法正常运行!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 一般情况下如果用户不授权的话,功能是无法运行的,做退出处理
finish();
}
}).show();
}
以上是关于Android动态申请多个权限-非第三方框架的主要内容,如果未能解决你的问题,请参考以下文章
Android6.0------权限申请RxPermissions
Android6.0------权限申请~easypermissions
Android 应用开发动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )