Android EasyPermissions官方库高效处理权限相关教程

介绍:

easypermission库是一个简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上。

1 相关文档

官方文档:

https://github.com/googlesamples/easypermissions

运行时权限官方文档解释:

https://developer.android.com/training/permissions/requesting.html

2 为什么使用Easypermissions

Android M对权限系统进行了改变。Android M之前所需权限只需要在AndroidManifest中申请即可。但更新Android M系统后,部分“Dangerous Permission”需要在运行时询问申请。

导入EasyPermissions依赖库:

在Module的build.gradle中添加以下代码。

dependencies {
 compile 'pub.devrel:easypermissions:1.0.1'
}

依赖库配置完成后,开始使用。

使用步骤

1. 使用EasyPermissions检查权限:

权限可以是单个,也可以是一些列。在EasyPermission库中,使用EasyPermissions#hasPermissions(...)检查若干权限。

<code> /**
  *
  * @param context
  * return true:已经获取权限
  * return false: 未获取权限,主动请求权限
  */
 public static boolean checkPermission(Activity context,String[] perms) {
  return EasyPermissions.hasPermissions(context, perms);
 }</code>
EasyPermissions.hasPermissions():

第一个参数 : Context参数.例如,Activity对象。

第二个参数 : 一些系列的权限。例如,public final static String[] PERMS_WRITE ={Manifest.permission.WRITE_EXTERNAL_STORAGE};

2. 使用EasyPermissions请求权限:

检查后,发觉用户没有赋予权限,这时候需要代码请求权限,让用户同意。

在EasyPermission库中,使用EasyPermissions#requestPermissions,来请求权限。

<code><code><code> /**
  * 请求权限
  * @param context
  */
 public static void requestPermission(Activity context,String tip,int requestCode,String[] perms) {
  EasyPermissions.requestPermissions(context, tip,requestCode,perms);
 }</code></code></code>
EasyPermissions.requestPermissions():

第一个参数:Context对象 第二个参数:权限弹窗上的文字提示语。告诉用户,这个权限用途。 第三个参数:这次请求权限的唯一标示,code。 第四个参数 : 一些系列的权限。

3. EasyPermissions响应请求结果:

请求后,弹出系统权限弹窗,剩下是用户是否授权操作。权限结果是回调在Activity或者Fragment中的重写的onRequestPermissionsResult()方法中。

<code><code><code>public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
 //.....省略部分代码。
 /**
  * 重写onRequestPermissionsResult,用于接受请求结果
  *
  * @param requestCode
  * @param permissions
  * @param grantResults
  */
 @Override
 public void onRequestPermissionsResult(int requestCode,
  @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  //将请求结果传递EasyPermission库处理
  EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
 }
 /**
  * 请求权限成功。
  * 可以弹窗显示结果,也可执行具体需要的逻辑操作
  *
  * @param requestCode
  * @param perms
  */
 @Override
 public void onPermissionsGranted(int requestCode, List<string> perms) {
  ToastUtils.showToast(getApplicationContext(), "用户授权成功");
 }
 /**
  * 请求权限失败
  *
  * @param requestCode
  * @param perms
  */
 @Override
 public void onPermissionsDenied(int requestCode, List<string> perms) {
  ToastUtils.showToast(getApplicationContext(), "用户授权失败");
  /**
   * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。
   * 这时候,需要跳转到设置界面去,让用户手动开启。
   */
  if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
   new AppSettingsDialog.Builder(this).build().show();
  }
 }
}</string></string></code></code></code>

将权限结果传递给EasyPermissions.onRequestPermissionsResult()来处理。、

EasyPermissions.onRequestPermissionsResult()方法:

第一个参数: 请求的code 第二个参数: 一些列的请求权限 第三个参数: 用户授权的结果 第四个参数: 权限回调监听器
这里不需要手写判断权限是否成功的逻辑操作,而会在EasyPermissions.PermissionCallbacks监听器中响应。

EasyPermissions.PermissionCallbacks接口:

onPermissionsGranted():

用户授权成功,接下来执行具体需要的逻辑操作

onPermissionsDenied():

用户授权失败,处理失败的逻辑。

注意:若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。 这时候,需要跳转到设置界面去,让用户手动开启。

你可能并不满足,需要手动调用逻辑处理方法。EasyPermissions库为你考虑好了,具备强大之处。当用户同意权限后,可以不需要通过监听器方式来实现,直接调用相关的逻辑代码的方法。只需要使用@AfterPermissionGranted注解标注逻辑处理的方法。

4. @AfterPermissionGranted注解:

@AfterPermissionGranted注解为了提供方便,但可以添加也可以不添加,是可选的。

好处:

使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。

简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。

以下代码,请求写入磁盘的权限,当用户同意权限后,弹出一个Toast弹窗的逻辑处理操作。

<code><code><code><code><code><code><code><code> @AfterPermissionGranted(Constance.WRITE_PERMISSION_CODE) 是可选的
 public void onPermissionsSuccess() {
  ToastUtils.showToast(getApplicationContext(), "用户授权成功");
 }</code></code></code></code></code></code></code></code>

当用户同意权限,该方法不需要手动调用,会匹配到的Constance.WRITE_PERMISSION_CODE请求码,自动执行。

5. 使用EasyPermissions处理权限被拒的情况:

在权限弹窗中,用户可能直接拒绝权限,下次权限请求依旧会弹出该权限弹窗。除此之外,还可以勾选'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限,下次请求权限,弹窗不能弹出,无法让用户授权。这时候,需要跳转到设置界面去,让用户手动开启。

在EasyPermission库中,使用EasyPermissions.somePermissionPermanentlyDenied()来处理,是否勾选不再提示的选项。

<code><code><code><code><code><code><code><code><code> /**
  * 请求权限失败
  *
  * @param requestCode
  * @param perms
  */
 @Override
 public void onPermissionsDenied(int requestCode, List<string> perms) {
  ToastUtils.showToast(getApplicationContext(), "用户授权失败");
  /**
   * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。
   * 这时候,需要跳转到设置界面去,让用户手动开启。
   */
  if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
   new AppSettingsDialog.Builder(this).build().show();
  }
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch (requestCode) {
   //当从软件设置界面,返回当前程序时候
   case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE:
    //执行Toast显示或者其他逻辑处理操作
    break;
  }
 }</string></code></code></code></code></code></code></code></code></code>

以上代码是,当无法弹出权限弹框,直接跳转到设置界面去,让用户手动开启权限。

当从设置界面返回时候,结果会在Activity或者Fragment中onActivityResult()响应。

运行效果,如下:

总结

以上所述是小编给大家介绍的Android EasyPermissions官方库高效处理权限相关教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Android判断用户是否允许了摄像头权限实例代码
  • Android无需申请权限拨打电话的两种方式
  • 详解Android数据存储之Android 6.0运行时权限下文件存储的思考
(0)

相关推荐

  • 详解Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以往直接sdcard根目录上直接新建了一个xxx/cache/目录来做文件存储就会不是那么容易控制了,所以有必要重新认识一下Android文件存储的相关知识了. 背景: 有关外置sdcard的读写权限 <uses-permission android:name="android.permissi

  • Android判断用户是否允许了摄像头权限实例代码

    如题,既然是判断用户是否允许了摄像头权限,那么,咱们就忽略是Manifest配置的问题,因为这是开发者的事. 用户在使用APP时,如果首次进入用摄像头的地方,手机会提示是否允许该应用使用摄像头.有些用户小手一抖.或者压根就不想开启摄像头,咔擦,就给你关了,那好了.下回再进入该功能,就会出现APP一片黑,或者崩溃的情况. 作为开发者,正常思路是要提示用户,摄像头权限被你关了,赶紧去手动开启,不然,就别想用该功能了!那,咱们该怎么实现这个思路呢? 一.判断摄像头权限 Android API没提供判断

  • Android无需申请权限拨打电话的两种方式

    Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); startActivity(intent); 第二种方法,拨打电话直接进行拨打,但是有些第三方rom(例如:MIUI),不会直接进行拨打,而是要用户进

  • Android EasyPermissions官方库高效处理权限相关教程

    介绍: easypermission库是一个简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 1 相关文档 官方文档: https://github.com/googlesamples/easypermissions 运行时权限官方文档解释: https://developer.android.com/training/permissions/requesting.html 2 为什么使用Easypermissions Android M对权限系统进行了改变.Android

  • Android 创建依赖库的方法(保姆级教程)

    新建工程,新建Module 新建一个工程,之后按下图中的操作方式,创建一个 Module 创建 Android Library 选中 Android Library,之后点击Next! 输入你要创建module名字 输入你要创建module名字,如果有,但请不要删除前面的两个冒号(可能会因AndroidStudio版本原因显示界面不一样)!之后点击Finish! 在Module中新建测试类 如图,找到以下文件目录,在Module中新建测试类 上传github 之后要上传Github,导入JitP

  • Android RecyclerView使用ListAdapter高效刷新数据的操作方法

    目录 问题 DiffUtils使用 ListAdapter使用 参考文献 我们都知道,当RecyclerView数据源更新后,还需要通过adapter调用对应的方法,从而让RecyclerView重新绘制页面 本次也是介绍了用另外一种方法来实现RecyclerView高效刷新数据的功能 问题 首先,默认各位是有使用RecyclerView的经验的, 对于数据的更新,我们一般可以使用adapter的下面四个方法: notifyDataSetChanged() 整个数据改变 notifyItemIn

  • android 网络请求库volley方法详解

    使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest("请求方法","请求的网络地址","成功的网

  • 超好用的Android高亮引导库的使用

    简介 HighlightPro是Android的一个高亮引导库,同时它还可以是一个简单的popup window库 功能: 可一次显示一个或多个高亮view 通过水平约束和竖直约束来准确定位提示view 自定义提示view的出现动画 自定义高亮形状和大小 自定义高亮形状的paint 链式调用,使用简单 支持简单的pop window 效果图: 用法: Gradle 在项目级的build.gradle文件种添加maven存储仓库Jitpack: allprojects { repositories

  • Android接入ffmpeg库及问题解决方法

    目录 一.准备交叉编译环境 二.交叉编译ffmpeg+libx264+libfdk-aac 1. 交叉编译libfdk-aac 2. 交叉编译libx264 3. 交叉编译ffmpeg 一.准备交叉编译环境 我的环境如下: 系统:ubuntu20.04 NDK版本:r17c NDK构建交叉工具链的方法参考:https://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn NDK r17c下载链接:https://deve

  • Android Jetpack组件库LiveData源码深入探究

    目录 前言 一.LiveData 二.使用案例 三.LiveData 实现原理 四.LiveData 相关源码 五.LiveData分发问题 Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle Android Jetpack之DataBinding+ViewModel+LiveData+Room 前言 Jetpack是一个由多个技术库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致

  • Oracle的用户、角色及权限相关操作

    1.创建用户 create user KD identified by 123456; 2.授予连接数据库的权限 grant connect to KD; 3.将Scott用户的emp表授权给KD可以查询 grant select on scott.emp to KD; grant create table to KD; 4.回收权限 revoke select on scott.emp from KD; 5.表的增删改权限授权 grant select,inset,delete,update

  • PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法

    PHP用mb_string函数库处理与windows相关中文字符 昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件内容等编码都是gbk,而我们在开发过程中,IDE里的编码则是UTF-8,(这里不讨论为什么等等问题, 只考虑怎么把编码转变成一样的)所以导致我写的UTF-8编码的正则模式字符串中的中文在gbk编码的文件中并不能正确匹配. 一开始,我并

  • Android网络请求库android-async-http介绍

    Android网络请求库:android-async-http开源框架 之前有一篇描述了客户端请求服务器端的方式-Post的请求方式.今天介绍一个请求服务器的一个开源库-android-async-http库. 1. 概念: 这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果. 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调结果 **(2).**Http异步请

随机推荐