《第一行代码》阅读笔记(二十五)——PermissionsDispatcher(补充)

摘要:
避免开发人员编写大量乏味的样板代码。开源地址:https://github.com/hotchemi/PermissionsDispatcher文件简介:http://hotchemi.github.io/PermissionsDispatcher/导入依赖项实现“org.permissionsdispatcher:permissionsddispatcher:4.7.0”annotationProcessor“org.perissionsdispatcher:ppermissionsdDispatcher:4.7.0”注意:带注释的方法不能是private@NeedsPermissionvoidmakeCall(){如果{Intentident=newIntent;Uridata=Uri.parse;intent.setData;startActivity;}}您需要在此处申请电话权限。如果用户同意,您可以调用//获取多个权限@NeedsPermissionpublicvoidgetMulti(){Toast.makeText.show();}这两个注释是必需的,并且其余的注释不是必需的@OnPermissionDenied//一旦用户拒绝了publicvoid multiDenied(){Toast.makeText.show();}@OnPermessionDenied//一旦用户放弃了publicvoid StorageDenied,但是如果许可请求失败并且用户检查不再询问,则它用于标记要执行的方法。注释括号中有参数,并传入要应用的权限。

PermissionsDispatcher是一个基于注解、帮助开发者简单处理Android 6.0系统中的运行时权限的开源库。避免了开发者编写大量繁琐的样板代码。

开源地址:https://github.com/hotchemi/PermissionsDispatcher
文档介绍:http://hotchemi.github.io/PermissionsDispatcher/

导入依赖

implementation "org.permissionsdispatcher:permissionsdispatcher:4.7.0"
annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:4.7.0"

注解

《第一行代码》阅读笔记(二十五)——PermissionsDispatcher(补充)第1张

注意:被注解的方法不能是私有方法。

@RuntimePermissions注解:这是必须使用的注解,用于标注在你想要申请权限的Activity或者Fragment上

@RuntimePermissions
public class SettingsActivity{

@NeedsPermission注解:这也是必须使用的注解,用于标注在你要获取权限的方法,注解括号里面有参数,传入想要申请的权限。也就是说你获取了相应的权限之后就会执行这个方法。

  @NeedsPermission(Manifest.permission.CALL_PHONE)
    void makeCall() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_DIAL);
            Uri data = Uri.parse("tel:" + getResources().getString(R.string.hot_line_phone_number));
            intent.setData(data);
            startActivity(intent);
        }
    }

这里需要申请电话权限,如果用户同意了,就打电话。
还可以多个权限一起申请。

    //获取多个权限
    @NeedsPermission({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
    public void getMulti() {
        Toast.makeText(this, "getMulti", Toast.LENGTH_SHORT).show();
    }

这两个注解是必须使用的,剩下的注解都不是必须选用的。

@OnShowRationale注解:这个不是必须的注解,用于标注申请权限前需要执行的方法,注解
括号里面有参数,传入想要申请的权限,而且这个方法还要传入一个PermissionRequest对象,这个对象有两种方法:proceed()让权限请求继续,cancel()让请求中断。也就是说,这个方法会拦截你发出的请求,这个方法用于告诉用户你接下来申请的权限是干嘛的,说服用户给你权限。

 @OnShowRationale({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})
    //给用户解释要请求什么权限,为什么需要此权限
    void showRationale(final PermissionRequest request) {
        new AlertDialog.Builder(this)
                .setMessage("使用此功能需要WRITE_EXTERNAL_STORAGE和RECORD_AUDIO权限,下一步将继续请求权限")
                .setPositiveButton("下一步", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.proceed();//继续执行请求
                    }
                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        request.cancel();//取消执行请求
                    }
                }).show();
    }

request.proceed(); 调出系统申请权限的弹窗会执行@NeedsPermissio对应的方法
request.cancel(); 会执行@OnPermissionDenied对应的方法

@OnPermissionDenied注解:这个也不是必须的注解,用于标注如果权限请求失败,但是用户没有勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败之后的处理,如像用户解释为什么要申请,或者重新申请操作等。

    @OnPermissionDenied({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})//一旦用户拒绝了
    public void multiDenied() {
        Toast.makeText(this, "已拒绝一个或以上权限", Toast.LENGTH_SHORT).show();
    }
 
 
    @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)//一旦用户拒绝了
    public void StorageDenied() {
        Toast.makeText(this, "已拒绝WRITE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
    }

@OnNeverAskAgain注解:这个也不是必须的注解,用于标注如果权限请求失败,而且用户勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败并选择不再询问之后的处理。例如,可以告诉作者想开启权限的就从手机设置里面开启。

注意,有些系统的不再询问勾选项是要用户拒绝授权一次才显示出来的。

 
    @OnNeverAskAgain({Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO})//用户选择的不再询问
    public void multiNeverAsk() {
        Toast.makeText(this, "已拒绝一个或以上权限,并不再询问", Toast.LENGTH_SHORT).show();
    }
    @OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)//用户选择的不再询问
    public void StorageNeverAsk() {
        Toast.makeText(this, "已拒绝WRITE_EXTERNAL_STORAGE权限,并不再询问", Toast.LENGTH_SHORT).show();
    }
解读

使用PermissionsDispatcher除了要实现注解之外,还要重写Activity的onRequestPermissionsResult()方法,在里面让一个PermissionsDispatcher执行回调。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        StudentChallengeActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。当要调用使用权限的方法的时候,不直接调用我们直接添加了@NeedsPermission的方法,而是调用这个类生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名。

这个PermissionsDispatcher是什么来的呢?
  
原来只要我们实现了@RuntimePermissions和@NeedsPermission这两个必须的注解之后,再build一次project之后,编译器就会在在appuildintermediatesclassesdebug目录下与被注解的Activity同一个包下这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
                StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);
    }

用来调用被注解的Activity的方法(就是因为这个所以被注解的方法不能private,private方法的作用域不在其他的类)。所以,第一次用的话,要注解好之后,build一次,下面的方法里面的PermissionsDispatcherActivityPermissionsDispatcher才不会令AS报红。

插件

AndroidStudio中还为我们提供了自动化生成工具。

《第一行代码》阅读笔记(二十五)——PermissionsDispatcher(补充)第2张

只要在setting设置里的plugins界面里搜索PermissionsDispatcher就可以安装了,安装完重启一下就能使用:

  • 在所需的Activity或者Fragment的代码里面右键,选择Generate,然后就可以选择Generate Runtime Permissions…(生成动态权限的生成)或者下面的Add PermissionsDispatcher dependencies(添加PermissionsDispatcher依赖)

点击Generate Runtime Permissions…即可自动生成,很简单粗暴。

参考文献:
PermissionsDispatcher使用详解
使用PermissionsDispatcher轻松解决Android权限问题

免责声明:文章转载自《《第一行代码》阅读笔记(二十五)——PermissionsDispatcher(补充)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇攻防世界-crypto-easychallenge(.pyc反编译)在Winform界面中使用DevExpress的TreeList实现节点过滤查询的两种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Kotlin实现《第一行代码》案例“酷欧天气”

看过《第一行代码》的朋友应该知道“酷欧天气”,作者郭神用整整一章的内容来讲述其从无到有的过程。 最近正好看完该书的第二版(也有人称“第二行代码”),尝试着将项目中的Java代码用Kotlin实现。 原项目获取点这里 Kotlin实现点这里 除了将Java转为Kotlin外,界面与资源的定义也略微做了调整,但是功能上没有变化(这部分后续进行完善,书中有提...

Android LBS 百度地图(参考: 《第一行代码》第2版(郭霖)11.3.2 确定自己位置的经纬度:准确数字信息)

昨天自己琢磨了几个小时,左冲右突,实验没成功。http://www.cnblogs.com/hbuwyg/p/7062285.html 计划按照郭老师的《第一行代码》教程再试一次。 前面的测试虽然没有成功,但积累了不少知识,看书轻松许多~ Android 2.3.3 / Windows 10 / AS自带jdk 11.2 申请API key  11.3...

《第一行代码》阅读笔记(二十二)——LitePal操作数据库

这里郭神又是一顿称赞,反正强无敌就行了。笔者也咨询了一些大神、专家。对于初学者来说这个框架不仅十分方便,足以应付需求,而且郭神讲解通俗易懂,值得一看。 附上Github链接:https://github.com/LitePalFramework/LitePal 配置LitePal 总结起来就是一句话(最新版的需要去github上面找) implementa...