【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )(一)

简介: 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 完整代码示例 | 申请权限 | 申请权限原理对话框 | 引导用户手动设置权限对话框 )(一)

一、申请权限


申请权限 步骤 :



权限判定 : 首先要判定是否已经授权指定的权限数组 ; 调用 EasyPermissions.hasPermissions 方法 , 进行判定 ;


 

/**
     * 检查当前的上下文对象 ( 应用 ) 是否被授权指定的权限集合
     *
     * @param context 调用方法的上下文对象.
     * @param perms   一个或多个权限, 如 {@link Manifest.permission#CAMERA}.
     * @return true 如果所有的权限都被授权了返回 true, 如果有一个权限没有被授予就会返回 false 
     * yet granted.
     * @see Manifest.permission
     */
    public static boolean hasPermissions(@NonNull Context context,
                                         @Size(min = 1) @NonNull String... perms)


权限判定分支 : 如果有要求的权限 , 就开始执行实际的逻辑 , 如果没有权限 , 就需要申请权限 ;


申请权限 : 调用 EasyPermissions.requestPermissions 方法 , 申请权限 ;


 

/**
     * 申请一组权限, 如果系统要求 ( 用户之前拒绝过 ) , 显示 权限申请原理对话框 , 
     * 向用户表明申请该权限的原因 .
     *
     * @param host        上下文对象 , 一般是 Activity.
     * @param rationale   解释为什么申请改组权限的原因的信息;
     *                    这些信息会在用户第一次拒绝权限申请后显示在 权限申请原理对话框 中.
     * @param requestCode 追踪本次权限申请的申请码 , 必须小于 256.
     * @param perms       本次申请的权限 , 这是一个可变参数 .
     * @see Manifest.permission
     */
    public static void requestPermissions(
            @NonNull Activity host, @NonNull String rationale,
            int requestCode, @Size(min = 1) @NonNull String... perms) {
        requestPermissions(
                new PermissionRequest.Builder(host, requestCode, perms)
                        .setRationale(rationale)
                        .build());
    }


注解中使用的常量定义 : 如果要在 @AfterPermissionGranted() 注解中使用常量 , 该常量只能使用 const val 定义 ;


定义方式 : const val 常量才是 Java 中的 public static final 对等的常量值 ;
定义位置 : const val 常量只能定义在 Kotlin 文件顶层, 或 object 对象表达式中, 不能定义在类中 ;
/**
 * 权限申请码, 作为权限申请的标识
 * 注意 : const val 常量才是 Java 中的 public static final 对等的常量值
 *        const val 常量只能定义在 Kotlin 文件中, 或 object 对象表达式中, 不能定义在类中
 */
const val PERMISSION_REQUEST_CODE : Int = 100;


数组转为可变参数 : Kotlin 中可以使用 Array<String> 数组作为可变参数 , 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组 , 如 *PERMMISSIONS ;


 

/**
     * 当做可变参数时 , 前面加上 * 符号 , 展开数组
     * *PERMMISSIONS 等同于可变参数
     */
    var PERMMISSIONS: Array<String> = arrayOf(Manifest.permission.CAMERA,
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.READ_CONTACTS,
        Manifest.permission.READ_SMS,
        Manifest.permission.WRITE_EXTERNAL_STORAGE)


申请权限代码示例 :


 

/**
     * AfterPermissionGranted 注解的作用是 , 当 请求吗 666 对应的权限申请全部通过后
     * 再次回调一次该方法 . ( 相当于调用了两次该方法 )
     */
    @AfterPermissionGranted( PERMISSION_REQUEST_CODE )
    fun doSomethingWithPermissions(){
        Log.i(TAG, "doSomethingWithPermissions")
        // 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
        // 调用 EasyPermissions.hasPermissions 方法判定是否已经申请该权限
        if(EasyPermissions.hasPermissions(this,
                *PERMMISSIONS)){
            // 如果有上述权限, 执行该操作
            Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show()
        }else{
            // 如果没有上述权限 , 那么申请权限
            EasyPermissions.requestPermissions(
                this,
                "权限申请原理对话框 : 描述申请权限的原理",
                PERMISSION_REQUEST_CODE,
                // 数组前加上 * 符号 , 可以将数组展开 , 转为可变数组
                *PERMMISSIONS
            )
        }
    }


申请权限结果响应操作 : 重写 Activity 的 onRequestPermissionsResult 方法 , 申请权限完成后 , 不管成功还是失败 , 都会回调 该方法 , 在此处将后续操作全部交给 EasyPermissions 操作 ;


 

/**
     * 二 、 重写 Activity 的 onRequestPermissionsResult 方法
     *    主要是在该方法中使用 EasyPermissions 进一步处理权限申请后续结果
     */
    override fun onRequestPermissionsResult(
        requestCode: Int, permissions: Array<out String>, grantResults: IntArray){
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        Log.i(TAG, "onRequestPermissionsResult")
        // 进一步使用 EasyPermissions 处理后续结果
        EasyPermissions.onRequestPermissionsResult(
            requestCode, permissions, grantResults, this);
    }


调用 EasyPermissions.onRequestPermissionsResult 的结果就是 , 如果用户同意了权限申请 , 就会回调 onPermissionsGranted 方法 , 如果用户拒绝了权限申请 , 就会回调 onPermissionsDenied 方法 ;






二、申请权限原理对话框


如果选择了 “拒绝” 选项 , 那就摊上事了 , 后面连带一大堆操作 , 处理后续权限管理的问题 ;

image.png


之前用户选择了拒绝 , 再次申请 , 就会自动弹出 权限申请原理对话框 , 该对话框的主要作用是 描述 申请权限的原理 ;


image.png


如果第一次申请权限 , 拒绝了某些权限的申请 , 第二次就会自动弹出 申请权限原理对话框 , 在这个对话框中 , 开发者需要给出为什么申请这些权限 , 说服用户同意这些权限的申请 ;


申请权限原理对话框 中的内容是在 EasyPermissions.requestPermissions 方法的参数中设定的 ;



回调函数 : 在 Activity 中实现 EasyPermissions.RationaleCallbacks 接口 , 在本 Activity 中调用 EasyPermissions.requestPermissions 方法申请权限时 , 就会自动应用上述机制 ,


 

/**
     * 申请权限原理对话框操作对应的回调函数 
     */
    public interface RationaleCallbacks {
        void onRationaleAccepted(int requestCode);
        void onRationaleDenied(int requestCode);
    }



申请权限原理对话框 : 用户申请权限 , 如果是首次申请 , 该对话框不弹出 , 如果不是首次申请 , 并且之前拒绝过某些权限申请 , 就会弹出该对话框 , 用户进行以下操作 :


用户点击 确定 : 就会继续执行权限申请的流程 , 弹出 权限申请 弹窗 ; 回调 onRationaleAccepted 方法 ;

用户点击 取消 : 一般不做任何操作 ; 回调 onRationaleDenied 方法 ;


代码示例 :


 

/**
     * 申请权限原理对话框操作对应的回调函数 
     */
    public interface RationaleCallbacks {
        void onRationaleAccepted(int requestCode);
        void onRationaleDenied(int requestCode);
    }


目录
相关文章
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
738 64
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
977 64
|
数据采集 机器学习/深度学习 编解码
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
本文详细介绍了一个简化版 Veo 3 文本到视频生成模型的构建过程。首先进行了数据预处理,涵盖了去重、不安全内容过滤、质量合规性检查以及数据标注等环节。
870 5
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
377 0
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
1904 11
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
456 2
|
开发工具 Android开发
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
521 1
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
671 4
|
Java 数据库连接
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
提升编程效率的利器: 解析Google Guava库之IO工具类(九)
|
安全 Java Android开发
Android 14适配Google play截止时间临近,适配注意点和经验
本文介绍了Android 14带来的关键更新,包括性能优化、定制化体验、多语言支持、多媒体与图形增强等功能。此外,还强调了适配时的重要事项,如targetSdkVersion升级、前台服务类型声明、蓝牙权限变更等,以及安全性与用户体验方面的改进。开发者需按官方指南更新应用,以充分利用新特性并确保兼容性和安全性。
1142 0

推荐镜像

更多