当前位置: 首页 > article >正文

Android 将EasyPermissions进一步封装,使得动态权限申请更加简明

1.引入依赖:

implementation 'pub.devrel:easypermissions:3.0.0'

2.在BaseActivity处理统一的结果回调和请求Code

核心内容:

        (1)处理Activity本身继承的方法onRequestPermissionsResult        

        (2)实现接口EasyPermissions.PermissionCallbacks来接收请求结果

        (3)定义申请权限跳转带出去的Code(Int类型,合法范围0-255)

        (4)定义PermissionsCallBack是对结果返回的进一步简化 (非必须)

/**
 *Author:XingHai.Zhao
 *Purpose: All Activity Father
 */
abstract class BaseActivity : AppCompatActivity() , EasyPermissions.PermissionCallbacks{
  
    var mPermCodeBLE: Int = 11
    var mPermCodeAUDIO: Int = 12

    // 用户给予相关权限成功后的回调
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        // 进一步使用 EasyPermissions 处理后续结果
        EasyPermissions.onRequestPermissionsResult(
            requestCode, permissions, grantResults, this)

    }
    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
        // 授予权限
        mPermissionsCallBack?.let {
            it.permissionsYes(requestCode)
        }
    }

    override fun onPermissionsDenied(requestCode: Int, list: List<String?>) {
        // 请求权限被拒
        mPermissionsCallBack?.let {
            it.permissionsNo(requestCode)
        }
    }

    var mPermissionsCallBack: PermissionsCallBack? = null

    interface PermissionsCallBack {
        fun permissionsYes(code: Int) //获取授权成功
        fun permissionsNo(code: Int) //获取授权成功
    }

    // 获取蓝牙相关的权限
    fun getBlePerm(): Array<String> {
        return when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> arrayOf(
                Manifest.permission.BLUETOOTH_SCAN,
                Manifest.permission.BLUETOOTH_CONNECT,
                Manifest.permission.BLUETOOTH_ADVERTISE,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> arrayOf(
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
            else -> arrayOf(
                Manifest.permission.BLUETOOTH_ADMIN,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
        }
    }

    // 获取录音和前台服务权限
    fun getAudioPerm(): Array<String> {
        val permissions = mutableListOf<String>()

        // 添加录音权限
        permissions.add(Manifest.permission.RECORD_AUDIO)

        // 根据 Android 版本添加前台服务权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            permissions.add(Manifest.permission.FOREGROUND_SERVICE)
        }

        return permissions.toTypedArray()
    }

}


3具体请求用蓝牙举例:

        //权限判断,第一次弹出系统的授权提示框
        if (EasyPermissions.hasPermissions(this, *getBlePerm())) {
            if (!BluetoothAdapter.getDefaultAdapter().isEnabled) {
                //打开蓝牙开关
                startActivity(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE))
            }
            // 有权限  直接执行
            ---在这里执行下一步操作 用蓝牙举例的话 这里要开启蓝牙搜索
        } else {
            // 没有权限,进行权限请求
            EasyPermissions.requestPermissions(
                this,
                getString("需要赋予相关权限,方能正常使用该功能!"),
                mPermCodeBLE,
                *getBlePerm()
            )
        }


        mPermissionsCallBack = object :PermissionsCallBack{

            override fun permissionsYes(code: Int) {
               ---在这里执行下一步操作 用蓝牙举例的话 这里要开启蓝牙搜索
            }

            override fun permissionsNo(code: Int) {

            }
        }
 


http://www.kler.cn/news/312188.html

相关文章:

  • Java 23、JDK 23正式发布!
  • C++之第十二课
  • 红日药业携手实在智能,构建RPA数字员工平台满足业务一体化需求 | 实在RPA案例
  • Java 多态(难)
  • VS运行程序时报错--无法定位程序输入点
  • Gitlab学习(007 gitlab项目操作)
  • 电影《祝你幸福!》观后感
  • 梧桐数据库(WuTongDB):SQL Server Query Optimizer 简介
  • OSPFv3协议几类LSA介绍
  • 【图像压缩与重构】基于标准+改进BP神经网络
  • Linux实操笔记2 Ubuntu安装Nginx的不同方法
  • python检测keycloak证书连接报错问题
  • 基于多域名,通过云运营商弹性负载,Nginx配置等基于的多租户系统部署
  • 有没有通过倾斜摄影文件直接导出DSM/DOM的文件软件?
  • npm发布插件超级简单版
  • django分发路由
  • alias 后门从入门到应急响应
  • 百度移动刷下拉词工具:快速出下拉词的技术分析
  • 肥胖成因:饮食之外,消耗吸收慢是关键因素
  • git gc
  • Java面试篇基础部分-线程的基本方法
  • 蓝桥杯-STM32G431RBT6(解决LCD与LED引脚冲突的问题)
  • 大数据时代:历史、发展与未来
  • 王道408考研数据结构-绪论
  • linux-软件包管理-软件源配置
  • Centos 7 搭建Samba
  • 初识Linux · 环境变量
  • VSCode开发ros程序无法智能提示的解决方法(二)
  • 亲测openEuler 22.03 LTS 安装MySQL 5.7和注意事项
  • Spring 源码解读:实现自定义注解处理器