Android 权限适配 从此第三方系统新增的权限无法判断状态的问题得到解决! 如MIUI自启动, 后台弹出界面权限等

博客探讨了如何解决Android应用在适配过程中,针对第三方系统如MIUI特有的开机自启动、后台省电、后台打开界面等权限判断问题。通过反射AppOpsManager获取权限常量值,并提供了示例代码进行权限检查,特别提到了MIUI11的OP_AUTO_START和OP_BACKGROUND_START_ACTIVITY。同时,推荐了相关文章解决权限跳转问题。
摘要由CSDN通过智能技术生成

如图:
在这里插入图片描述

我们在做适配的时候有没有遇到一类需求, 比如 判断某个权限, 而这个权限是某手机自己创造的 不属于原生api, 怎么判断? 如 第三方ROM中的 [开机自启动] [后台省电] [后台打开界面] 等

现在, 有办法解决了!

很简单, 原理是通过反射AppOpsManager取得支持的变量, 理论上 华为小米 魅族这些新增的权限都会在这个类里面增加常量值, 我们只需要反射遍历这些常量值即可:
以[后台弹出界面] 权限为例:
我们在app里加入这个函数, 运行app 后观察log日志 观察哪些权限的变量名和[后台弹出界面] 的意思比较和相似, 进行定位

 /**
     * 通过这个获取所有的OPS Field, 理论上第三方系统厂商都是修改这个来实现新增权限的, 这个可以解决比如miui的自启动和后台弹出界面等
     */
    fun getAllOPSField(context: Context) {
   
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
   
            val manager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
            val f = manager.javaClass.declaredFields
         
            for (field in f) {
   
                if (field.type == Int::class.java && Modifier.isStatic(field.modifiers)) {
   
                    field.isAccessible = true
                    println("${field.name} = ${field.get(null)}")
                }
            }
            
        }
    }

然后通过一下代码判断该权限

@RequiresApi(Build.VERSION_CODES.KITKAT)
        fun checkOp(context: Context, op: Int): Boolean {
   
            val version = Build.VERSION.SDK_INT
            if (version >= 19) {
   
                val manager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
                try {
   
                    val managerClass = manager.javaClass
                    val method = managerClass.getDeclaredMethod(
                        "checkOp",
                        Int::class.java,
                        Int::class.java,
                        String::class.
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值