美文网首页Android6.0Android技术集锦
PermissionsDispatcher,Android 6.

PermissionsDispatcher,Android 6.

作者: CYRUS_STUDIO | 来源:发表于2017-04-13 23:11 被阅读5361次
    image

    运行时权限

    从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。

    系统权限分为两类:

    • 正常权限:只需在你应用的 Androidmanifest.xml 中列出,安装时授权。
    • 危险权限:需要在你应用的 Androidmanifest.xml 中列出,并在运行时授权。

    如需了解更多关于正常权限与危险权限可以参阅这里

    关于 Android 6.0 运行时权限的详细讲解可以看这篇文章官方文档

    运行时权限的加入增加了用户隐私的安全,但同时也给开发者带来了一些负担,因为多了检查权限,请求权限,处理权限请求响应的步骤。

    于是就出现了一些框架,用于简化运行时权限的处理,如 PermissionsDispatcherDexterRxPermissionseasypermissions 等。

    这里只用过 easypermissions 和 PermissionsDispatcher,最终选择了 PermissionsDispatcher,原因是使用人数最多,api 设计简单易用,兼容性较好,easypermissions 使用起来相对麻烦一些。

    PermissionsDispatcher

    PermissionsDispatcher 提供简单的基于注解的 api 处理 Android Marshmallow 下的运行时权限(非反射方式)。

    项目地址:https://github.com/hotchemi/PermissionsDispatcher

    一. 集成说明

    注意把 ${latest.version} 改为最新版本

    打开命令行,cd 到工程根目录,执行 gradlew -version 或者 gradlew -v 命令查看当前工程 gradle 版本。

    根据 gradle 版本进行如下配置:

    Android Gradle Plugin >= 2.2

    在 app 模块下的 build.gradle 添加下面的配置:

    dependencies {
      compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
      annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
    }
    

    Android Gradle Plugin < 2.2

    在 project-level 下的 build.gradle 添加下面配置:

    buildscript {
      dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      }
    }
    

    然后,在 app 模块下的 build.gradle 添加下面配置:

    apply plugin: 'android-apt'
    
    dependencies {
      compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
      apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
    }
    

    二. 使用说明

    1. 添加注解

    注意:注解的方法不能是 private 的。

    相关注解说明

    注解 是否必须 描述
    @RuntimePermissions 注册一个 ActivityFragment 用于处理权限
    @NeedsPermission 注解一个方法,说明需要什么权限(一个或多个)
    @OnShowRationale 注解一个方法,解释为什么需要这些权限
    @OnPermissionDenied 注解一个方法,当用户拒绝授权时将调用该方法
    @OnNeverAskAgain 注解一个方法,当用户选择了 "不再提醒" 将调用该方法

    示例代码

    @RuntimePermissions 
    public class MainActivity extends AppCompatActivity {
    
        // 单个权限
        // @NeedsPermission(Manifest.permission.CAMERA)
        // 多个权限
        @NeedsPermission({ Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO })
        void showCamera() {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                    .addToBackStack("camera")
                    .commitAllowingStateLoss();
        }
        
        // 向用户说明为什么需要这些权限(可选)
        @OnShowRationale(Manifest.permission.CAMERA)
        void showRationaleForCamera(final PermissionRequest request) {
            new AlertDialog.Builder(this)
                .setMessage(R.string.permission_camera_rationale)
                .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
                .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
                .show();
        }
    
        // 用户拒绝授权回调(可选)
        @OnPermissionDenied(Manifest.permission.CAMERA)
        void showDeniedForCamera() {
            Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
        }
    
        // 用户勾选了“不再提醒”时调用(可选)
        @OnNeverAskAgain(Manifest.permission.CAMERA)
        void showNeverAskForCamera() {
            Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
        }
    }
    

    2. 调用自动生成的辅助类

    注解写好后,Build ——> Make Module ***PermissionsDispatcher 会生成一个 MainActivityPermissionsDispatcher(Activity Name + PermissionsDispatcher),你可以使用它来安全地访问这些受权限保护的方法。

    你唯一需要做的一件事是将工作委托给这个辅助类:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button_camera).setOnClickListener(v -> {
          // 调用带权限检查的 showCamera 方法
          MainActivityPermissionsDispatcher.showCameraWithCheck(this);
        });
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        // 代理权限处理到自动生成的方法
        MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }
    

    *PermissionDispatcher.*WithCheck 方法对你原来的方法进行了包装,包了一层权限检查的代码,你需要做的就是把原来的方法调用改为 *PermissionDispatcher.*WithCheck。另外,在 onRequestPermissionsResult 中回调 *PermissionsDispatcher.onRequestPermissionsResult 方法。

    三. 获取特殊权限

    两个特殊权限:

    • Manifest.permission.SYSTEM_ALERT_WINDOW:显示悬浮窗
    • Manifest.permission.WRITE_SETTINGS:读写系统设置

    对于这两个权限,在 Android 下默认是需要到 Settings -> Apps 中手动授权的。由于不同 ROM 情况可能还有点不一样。

    PermissionsDispatcher 对于两个特殊权限也做了兼容处理(Android6.0+),使用方法如上一样。

    如果需要兼容低版本的 Android 系统或者不同 ROM 可以参考这个开源项目

    四. maxSdkVersion

    <uses-permission> 有一个 maxSdkVersion 属性,PermissionsDispatcher 对它也做了支持。

    比如,在 Androidmanifest.xml 中定义了如下权限:

    <uses-permission
         android:name="android.permission.WRITE_EXTERNAL_STORAGE"
         android:maxSdkVersion="18" />
    

    注解中添加 maxSdkVersion

    @RuntimePermissions
    public class MainActivity extends AppCompatActivity {
    
        @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)
        void getStorage() {
            // ...
        }
        
    }
    

    PermissionsDispatcher Plugin

    PermissionsDispatcher Plugin 是 PermissionsDispatcher 的辅助插件,支持自动生成权限检查相关代码。

    项目地址:https://github.com/shiraji/permissions-dispatcher-plugin

    安装说明:Android Studio 中打开 Setting,Plugins ——> Browse repositories... 搜索 PermissionsDispatcher plugin,点 Install 下载安装,安装完成后重启生效。

    imageimage

    使用说明:

    1. 在 Activity/Fragment 中,Generate -> Generate Runtime Permissions...
    2. 选择权限并为每个注解输入方法名
    3. 点击 Generate ,完成

    使用过程中发现有两个小问题需要注意一下:

    1. 多次生成代码,onRequestPermissionsResult 方法也会被自动添加多次
    2. 代码生成后会提示你是否 rebuild 工程,建议选择取消,Build ——> Make Module *** 相对快些

    相关文章

      网友评论

      • b05da6178057:Make Project 一直连接超时 网络没有问题怎么回事大佬 你有遇到过吗?
      • 诡异的叶子:大佬,这种权限应该可以在加载的界面做全部请求的吧。。。一般放Application比较好,还是放加载界面比较好
      • d3b602e70cc9:rebuild 后,也没有***ActivityPermissionsDispatcher这个辅助类..Make Module***后也没有,重启电脑后再次Make Module和rebuild后还是没有...
        d3b602e70cc9:@linchaolong AS报红..找不到类.
        CYRUS_STUDIO:@kangjinwen 没有报错么
      • 被时光移动的城:大佬,我手写可以,但是用的plugin怎么总是报错,是什么原因?!求正确姿势
        CPLASF1925:@被时光移动的城 怎么解决的
        被时光移动的城: @linchaolong 谢谢,我解决了,v7包的问题
        CYRUS_STUDIO: @被时光移动的城 看看报什么错?
      • yuyu000:谢谢:clap:
        93109dbc5c02:ActivityCompat.requestPermissions(target, PERMISSION_REQUESTCAMERAPERMISSION, REQUEST_REQUESTCAMERAPERMISSION);
        }不报错,但是授权框没弹出来
        CYRUS_STUDIO: @yuyu000 🙂

      本文标题:PermissionsDispatcher,Android 6.

      本文链接:https://www.haomeiwen.com/subject/xegyattx.html