Android权限请求第三方库的比较
自Android6.0后有了动态权限管理,涉及到用户隐私的危险权限需要用户手动确认之后才可以使用,这里主要总结了原生,EasyPermissions,RxPermissions以及PermissionsDispatcher四种方式。
1.原生请求。
权限请求:
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};public void original() {ArrayList<String> strings = new ArrayList<>();for (String item : permissions) {//循环对所有权限进行检查if (ContextCompat.checkSelfPermission(this, item) == PackageManager.PERMISSION_GRANTED) {//权限允许} else {strings.add(item);}}if (strings.size() > 0) {//对没有允许的权限进行请求ActivityCompat.requestPermissions(this, strings.toArray(new String[strings.size()]), REQUEST_PERMISSION);}}
请求结果返回:
@Override/*permissions和grantResults中子项是一一对应的*/public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case REQUEST_PERMISSION://原生权限检测返回if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//这个只是代表了在这一部分同时请求的权限至少有一个被允许了ArrayList<Object> others = new ArrayList<>();for (int i = 0; i < grantResults.length; i++) {int item = grantResults[i];if (item == PackageManager.PERMISSION_GRANTED) {//条件允许} else {//此处是对每一项未被允许的权限进行说明others.add(permissions[i]);Toast.makeText(this, "您已拒绝提供" + (permissions[i].equals(Manifest.permission.CAMERA) ? "相机权限" : "读写权限"), Toast.LENGTH_SHORT).show();}}if (others.size() > 0) {//如果存在未被允许的权限就要进行另外的操作处理}} else {Toast.makeText(this, "您已拒绝提供相关权限,如需继续使用请在设置中打开", Toast.LENGTH_SHORT).show();}break;}}
2.EasyPermissions库
权限请求:
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};public void EasyPermissions() {if (EasyPermissions.hasPermissions(this, permissions)) {//有全部的权限,做对应的操作Toast.makeText(this, "该应用已拥有所有权限", Toast.LENGTH_SHORT).show();} else {PermissionRequest request = new PermissionRequest.Builder(this, REQUEST_PERMISSION_EASY, permissions).setRationale("该App正常使用需要用到的权限").setNegativeButtonText("不可以哟").setPositiveButtonText("允许")
// .setTheme(R.style.myPermissionStyle).build();EasyPermissions.requestPermissions(request);}}
请求结果返回:
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);//将请求结果交由 EasyPermissions处理}@Overridepublic void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
//权限申请成功if (perms != null && perms.size() > 0) {StringBuffer stringBuffer = new StringBuffer();for (String item : perms) {stringBuffer.append(item).append(",");}Toast.makeText(this, "该应用已允许权限:" + stringBuffer.toString().trim(), Toast.LENGTH_SHORT).show();}}@Overridepublic void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
//权限申请失败if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {new AppSettingsDialog.Builder(this).build().show();}}
3.PermissionsDispatcher库
权限请求:
要给对应使用权限的activity或fragment添加注解@RuntimePermissions 来进行注册 @NeedsPermission({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})public void disPer() {//TODO 此处写上需要用到权限的操作
//下面这个方法是用来调取未被允许的权限的,如果权限都已经被允许了,这个方法会引起死循环MainActivityPermissionsDispatcher.disPerWithPermissionCheck(this);}
请求结果返回:
@Override/*permissions和grantResults中子项是一一对应的*/public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);}//下面两个方法中的请求要和申请时的一一对应 @OnPermissionDenied({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})public void onCameraDenied() {Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();}@OnNeverAskAgain({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})public void onCameraNeverAskAgain() {Toast.makeText(this, "并不再询问", Toast.LENGTH_SHORT).show();}
4.RxPermissions库
权限请求:
使用方式分为两种:
a.单独调用:
RxPermissions rxPermissions = new RxPermissions(this);将所有的权限请求结果合并到一起处理rxPermissions.request(permissions).subscribe(boo->{if (boo) {//授权Toast.makeText(this, "该应用已允许权限", Toast.LENGTH_SHORT).show();} else {//未授权Toast.makeText(this, "该应用已拒绝权限", Toast.LENGTH_SHORT).show();}});//对每一个权限请求结果进行处理rxPermissions.requestEach(permissions).subscribe(permission -> {if (permission.granted) {//授权Toast.makeText(this, "该应用已允许权限:" + permission.name, Toast.LENGTH_SHORT).show();} else {//未授权Toast.makeText(this, "该应用已拒绝权限:" + permission.name, Toast.LENGTH_SHORT).show();}});
b.和RxBinding配合使用:
//权限结果合并处理
RxView.clicks(findViewById(R.id.enableCamera)).compose(rxPermissions.ensure(Manifest.permission.CAMERA)).subscribe(granted -> {// R.id.enableCamera has been clicked});
//权限结果单独处理RxView.clicks(mLlScan).compose(rxPermissions.ensureEach(Manifest.permission.CAMERA)).subscribe(permission -> {if (permission.granted){}else if (permission.shouldShowRequestPermissionRationale){}else {}});
关于Android11以上部分型号手机强制存储权限申请:
public static boolean isManager(Context context) {if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
//判断当前手机系统是否是Android11if (Environment.isExternalStorageManager()) {return true;}else {AlertDialog alertDialog;AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.DialogStyle);builder.setPositiveButton("确认", null);builder.setTitle("缺少必要权限");builder.setMessage("Android 11 需要授予所有文件的管理权限");builder.setCancelable(false);alertDialog = builder.create();alertDialog.show();alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {alertDialog.dismiss();//去获取文件管理Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + context.getPackageName()));((Activity)context).startActivityForResult(intent, 0x99);});return false;}} else {return true;}}
Android权限请求第三方库的比较相关推荐
- Xamarin Android权限请求
Xamarin Android权限请求 Android权限规定了App是否可以访问特定的资源,如网络.电话和短信.在原有API 6.0之前,App在安全的时候,会请求一次权限.一旦安装后,App就可以 ...
- android studio 导入第三方库的记录
android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...
- Android中集成第三方库的方法和问题
Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...
- Android Studio导入第三方库的三种方法
今天在项目中使用一个图片选择器的第三方框架--GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. Androi ...
- Android Studio 下载第三方库失败
Android Studio下载第三方库失败 网上其他教程相对较老,而且我用的Android Studio的版本为2021,目录结构不太一致. 按网上的其他教程来看,按以下方法就可以解决问题. 但我的 ...
- hook Android 权限请求, 插入权限目的dialog显示
Permission_aim_tip 作用 因为越来越严格的隐私政策要求,需要在申请权限的时候,告知用户需要该权限的目的.为了能快速适配已有项目,需要一个能自动感知权限申请,并显示申请原因的框架.于是 ...
- 懂得这些,不再惧怕Android权限请求
转载请注明出处:http://blog.csdn.net/qq220011qq/article/details/61204531 Android的权限请求是一个坑,开发的时候总是有些害怕Android ...
- Android 无法解决第三方库依赖问题
最近做第三方授权登录的时候,经常需要依赖一些第三方库,但是在 build.gradle 文件中添加了如下语句后, //新浪微博认证授权 implementation 'com.sina.weibo.s ...
- android studio导入第三方库和demo
导demo,导第三方库,都可以用这个方法,别想太复杂了, file - new - import module
- AS(android studio) 添加第三方库时报,Error: Failed to resolve: com.github Affected Modules 解决办法
测试环境: as3.4 问题描述: 准备引入一个第三方库实现的日期时间控件,在build.gradle(module:app)中加入以下代码,然后刷新项目,就报Error: Failed to res ...
最新文章
- /boor删除恢复,
- 基于Springboot实现医院HIS信息管理系统
- Android在OnCreate中获取控件的宽度和高度
- 为对象添加方法mothod
- android--多线程,android多线程
- 工科神器matlab高校遭禁用,网友:关我p事,python可取而代之
- php倒计时不停止,php – 当窗口不在焦点时停止的Javascript倒计时器
- mysql查询hash分区数据_mysql分区管理 - hash分区
- 列表解析(list comprehension) 与三目运算符
- Windows Server 2012 AD DS环境下域用户自动加入本地管理员组
- 邮箱客户端 gmail支持_如何联系Gmail支持
- MTK_on_line_FAQ_SW_ALPS_System+-+Bootup
- 浅谈OLAP系统核心技术点
- x264和x265编码技术的区别
- 集成智能小车(二...2)整体设计之谋
- Freetype 基本的API调用
- docker 创建nacos-server standalone
- 提供一个免费的directui界面库(已开源)
- 企业云邮箱申请,TOM企业邮箱,2021不见不散
- 计算机辅助在医学中的应用,计算机在医学领域的应用
热门文章
- HTL6033是一款专用于3串锂电池或聚合物电池的保护芯片
- lg android tv遥控器,LG TV Remote遥控器
- 几个鲜为人知但很有用的 HTML 属性
- If you want to be loved, be lovable.
- 前端培训课随感,传智、千锋、尚硅谷、渡一
- iOS查看每日限免APP+监控APP降价信息教程
- Linux 中断(IRQ/softirq)基础:原理及内核实现
- 记一次小白的手游脚本破解过程及难题
- html怎么定义403页面,自定义 403 错误页面(示例代码)
- 访问html 403 iis,IIS 403 错误详细原因 及解决办法总结