Android 多权限动态申请的优化
来源:互联网 发布:mac版bt下载软件 编辑:程序博客网 时间:2024/06/14 10:55
Android 多权限动态申请的优化
最近,在看其他项目代码中,发现多权限的申请方法,有缺陷,判断是只判断的其中一个是否有权限,这就有问题,另外,失败的话,是全部返回失败,并没有得到到底哪一个失败了。所以自己完善优化下多权限申请。
/** * 多权限申请 * @param permissions 权限组 * @param messageRes 提示语组 */ public void checkPermissions(String[] permissions, @StringRes int[] messageRes, PermissionCallBack callBack) { this.mPermissionCallBack = callBack; List<String> needPermissions = new ArrayList<>(); needPermissions = getDeniedPermissions(permissions,messageRes); if(needPermissions == null||needPermissions.size() == 0){ //已经拥有授权 callBack.onSuccess(); } else { ActivityCompat.requestPermissions(this, needPermissions.toArray(new String[needPermissions.size()]), BaseConfig.ACTION_PERMISSIONS_REQUEST); } }
/** * 获得权限组需要申请的权限 * @param permissions * @param messageRes * @return */ public List<String> getDeniedPermissions(String[] permissions, @StringRes int[] messageRes) { List<String> needRequestPermissionList = new ArrayList<>(); // 检查是否已经具有权限 for (int i = 0; i<permissions.length;i++) { if (ContextCompat.checkSelfPermission(this, permissions[i]) != PackageManager.PERMISSION_GRANTED) { // 是否需要告诉用户我们为什么需要这个权限 if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { //弹出信息,告诉用户我们为啥需要权限// showToastAlertDialog(messageRes[i]); } needRequestPermissionList.add(permissions[i]); } } return needRequestPermissionList; }
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case BaseConfig.ACTION_PERMISSIONS_REQUEST: { List<String> refusedPermissions = new ArrayList<>(); if (grantResults.length > 0 && verifyPermissions(grantResults)) { if (mPermissionCallBack != null) { mPermissionCallBack.onSuccess(); } } else { // 多权限返回哪个是被拒绝 for(int i = 0;i<permissions.length;i++){ if(grantResults[i] != PackageManager.PERMISSION_GRANTED) refusedPermissions.add(permissions[i]); } //权限没能授权通过,可以考虑弹个toast告诉用户 if (mPermissionCallBack != null) { mPermissionCallBack.onFailed(refusedPermissions); } } break; } default: break; } } /** * 确认所有的权限是否都已授权 * * @param grantResults * @return */ private boolean verifyPermissions(int[] grantResults) { for (int grantResult : grantResults) { if (grantResult != PackageManager.PERMISSION_GRANTED) { return false; } } return true; }
方法如何使用
checkPermissions(permissions,messageRes, new PermissionCallBack() { @Override public void onSuccess() { // 操作获得手机权限后的方法 // 开启定位 } @Override public void onFailed(List<String> refusedPermissions) { boolean isRefusedPhone = false,isRefusedLocation = false; for(String refusedPermission : refusedPermissions) { if (refusedPermission.equals(Manifest.permission.ACCESS_FINE_LOCATION)) { isRefusedLocation = true; } else if(refusedPermission.equals(Manifest.permission.READ_PHONE_STATE)){ isRefusedPhone = true; } } if(!isRefusedPhone) { // 操作获得手机权限后的方法 } if(!isRefusedLocation) { // 开启定位 } } });
0 0
- Android 多权限动态申请的优化
- android 动态申请权限
- Android 动态申请权限
- android 动态申请权限
- Android动态权限申请
- Android动态申请权限
- Android动态申请权限
- android动态申请权限
- android 动态权限申请
- Android动态权限申请
- Android权限动态申请
- Android权限动态申请
- Android动态申请权限
- Android 6.0动态权限申请的处理
- android 6.0以上动态权限的申请
- Android权限申请哪些需要动态申请
- Android 6.0 动态申请权限
- android M 动态申请权限
- 国科大软件安全漏洞分析与发现第一次作业key1
- 集合框架
- android 非系统APP访问字符设备
- bootstrap的editTable实现方法
- Swift&AutoLayout
- Android 多权限动态申请的优化
- iframe
- 2017国际体验设计大会亮点抢先看!
- 2017年阿里巴巴内推实习电话面试2
- 笔记之Python网络数据采集
- Spring注解下使用定时器
- 原生实现响应式模态框
- 【Linux】Centos之安装Nginx及注意事项
- oracle数据库创建用户并授权