自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权限请求第三方库的比较相关推荐

  1. Xamarin Android权限请求

    Xamarin Android权限请求 Android权限规定了App是否可以访问特定的资源,如网络.电话和短信.在原有API 6.0之前,App在安全的时候,会请求一次权限.一旦安装后,App就可以 ...

  2. android studio 导入第三方库的记录

    android studio 导入第三方库的记录.jar包 和 库 一.jar包 1.jar包的话很简单,首先换成project模式,将你要用的jar包复制到lib下面.如图 2.然后右键选择Add ...

  3. Android中集成第三方库的方法和问题

    Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...

  4. Android Studio导入第三方库的三种方法

    今天在项目中使用一个图片选择器的第三方框架--GalleryFinal,想要导入源码,以便于修改,于是上完查找了一下方法,想到之前用到过其他导入第三方库的方法,现在做个小总结,以防忘记. Androi ...

  5. Android Studio 下载第三方库失败

    Android Studio下载第三方库失败 网上其他教程相对较老,而且我用的Android Studio的版本为2021,目录结构不太一致. 按网上的其他教程来看,按以下方法就可以解决问题. 但我的 ...

  6. hook Android 权限请求, 插入权限目的dialog显示

    Permission_aim_tip 作用 因为越来越严格的隐私政策要求,需要在申请权限的时候,告知用户需要该权限的目的.为了能快速适配已有项目,需要一个能自动感知权限申请,并显示申请原因的框架.于是 ...

  7. 懂得这些,不再惧怕Android权限请求

    转载请注明出处:http://blog.csdn.net/qq220011qq/article/details/61204531 Android的权限请求是一个坑,开发的时候总是有些害怕Android ...

  8. Android 无法解决第三方库依赖问题

    最近做第三方授权登录的时候,经常需要依赖一些第三方库,但是在 build.gradle 文件中添加了如下语句后, //新浪微博认证授权 implementation 'com.sina.weibo.s ...

  9. android studio导入第三方库和demo

    导demo,导第三方库,都可以用这个方法,别想太复杂了, file - new - import module

  10. AS(android studio) 添加第三方库时报,Error: Failed to resolve: com.github Affected Modules 解决办法

    测试环境: as3.4 问题描述: 准备引入一个第三方库实现的日期时间控件,在build.gradle(module:app)中加入以下代码,然后刷新项目,就报Error: Failed to res ...

最新文章

  1. /boor删除恢复,
  2. 基于Springboot实现医院HIS信息管理系统
  3. Android在OnCreate中获取控件的宽度和高度
  4. 为对象添加方法mothod
  5. android--多线程,android多线程
  6. 工科神器matlab高校遭禁用,网友:关我p事,python可取而代之
  7. php倒计时不停止,php – 当窗口不在焦点时停止的Javascript倒计时器
  8. mysql查询hash分区数据_mysql分区管理 - hash分区
  9. 列表解析(list comprehension) 与三目运算符
  10. Windows Server 2012 AD DS环境下域用户自动加入本地管理员组
  11. 邮箱客户端 gmail支持_如何联系Gmail支持
  12. MTK_on_line_FAQ_SW_ALPS_System+-+Bootup
  13. 浅谈OLAP系统核心技术点
  14. x264和x265编码技术的区别
  15. 集成智能小车(二...2)整体设计之谋
  16. Freetype 基本的API调用
  17. docker 创建nacos-server standalone
  18. 提供一个免费的directui界面库(已开源)
  19. 企业云邮箱申请,TOM企业邮箱,2021不见不散
  20. 计算机辅助在医学中的应用,计算机在医学领域的应用

热门文章

  1. HTL6033是一款专用于3串锂电池或聚合物电池的保护芯片
  2. lg android tv遥控器,LG TV Remote遥控器
  3. 几个鲜为人知但很有用的 HTML 属性
  4. If you want to be loved, be lovable.
  5. 前端培训课随感,传智、千锋、尚硅谷、渡一
  6. iOS查看每日限免APP+监控APP降价信息教程
  7. Linux 中断(IRQ/softirq)基础:原理及内核实现
  8. 记一次小白的手游脚本破解过程及难题
  9. html怎么定义403页面,自定义 403 错误页面(示例代码)
  10. 访问html 403 iis,IIS 403 错误详细原因 及解决办法总结