[Blankj/AndroidUtilCode]PermissionUtils失效

2024-07-15 279 views
1
描述 Bug

升级版本后PermissionUtils失效,直接走PermissionUtils.SimpleCallback的onDenied()回调。老版本utilcode:1.23.7无此问题,可以正常请求权限

  • AndroidUtilCode 的版本: utilcode:1.29.0
  • 出现 Bug 的设备型号:小米8,MIUI11.0.8正式版
  • 设备的 Android 版本:android10
相关代码
        PermissionUtils.permission(PermissionConstants.CAMERA)
                .callback(new PermissionUtils.SimpleCallback() {
                    @Override
                    public void onGranted() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onDenied() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();

                    }
                })
                .request();

回答

6

你 debug 看下具体流程?我这边没问题

7

刚刚单独新建一个了工程测试两个版本的utilcode,发现两个情况:

  1. 新旧版中void requestCallback()的判断逻辑不同:旧版1.23.7的camera权限未在manifest中申明时,走mSimpleCallback.onGranted()分支,新版则走mSimpleCallback.onDenied()分支,这一点新版处理方式更合理;
  2. 我的问题出现在原来的组件是依赖于旧版1.23.7并编译上传至maven,打包时多个组件中有有的组件依赖于新版1.29.0,然后发现依赖于旧版的权限申请不行了。debug发现一个奇怪的问题: image 这里permissions代码里面传的明明是PermissionConstants.CAMERA,到构造方法里面却变成了:{"android.permission-group.CAMERA"},按道理应该是{"CAMERA"}才对
1

2 没什么问题,最终处理的时候我会根据你传入的 camera 来获取 manifest 中申明的权限组做处理。

7

定位到问题根源了: 旧版1.23.7的PermissionConstants:

@SuppressLint("InlinedApi")
public final class PermissionConstants {

    public static final String CALENDAR   = Manifest.permission_group.CALENDAR;
    public static final String CAMERA     = Manifest.permission_group.CAMERA;
    ......
}

新版1.29.0的PermissionConstants:

@SuppressLint("InlinedApi")
public final class PermissionConstants {

    public static final String CALENDAR   = "CALENDAR";
    public static final String CAMERA     = "CAMERA";
    ......
}

我的部分组件由于引用的是1.23.7,打包app的时候引用方式是gradle引用不是源码引用,PermissionConstants.CAMERA已经被编译成Manifest.permission_group.CAMERA,也就是“android.permission-group.CAMERA”,而新版的逻辑需要的是"CAMERA",所以这里实质上是一个兼容性问题,表面上看去都是PermissionConstants.CAMERA的引用好像没有兼容问题,但是字符串常量编译的时候会被直接改为对应的字符串,这一点比较特殊,不同于方法的引用。

所以结论是:1.23.7与1.29.0实际是不兼容的,除非整个项目都是源码引用

6

你这说法不对啊,两个类肯定是同一个 aar 里面的,怎么会是一个是 1.23.7,一个是 1.29.0 呢,最终依赖打进去一般都是走的高版本的吧。

5

比如我的业务组件A引用了1.23.7,我组件开发好编译上传至公司maven仓库,编译的时候PermissionConstants.CAMERA的引用处已经被就地替换为“android.permission-group.CAMERA”,然后我的业务组件B引用的是1.29.0,编译上传的时候同样的,PermissionConstants.CAMERA的引用处就地替换为“CAMERA”。然后我打包,根据gradle默认规则就是使用1.29.0,所以业务组件A的PermissionUtils相关代码就会有问题,而我如果强制指定为1.23.7,则业务组件B的PermissionUtils相关代码就会有问题,始终是冲突的,除非我业务组件A、B是直接引用源码,那样才不会有问题

6

你组件 A 的 aar 里面是没有我的源码的,只有 pom 依赖,同理组件 B 也是如此,不是你想的那样的,最终是你的工程同步的时候会去拉取一份 1.29.0 的源码到本地,然后打包的时候打进去。按照你说的那样编译的时候早就报类重复了。

2

就是因为没有你的源码才出的这个问题: 组件A的源码:

        PermissionUtils.permission(PermissionConstants.CAMERA)
                .callback(new PermissionUtils.SimpleCallback() {
                    @Override
                    public void onGranted() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onDenied() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();

                    }
                })
                .request();

组件A编译后arr中的相关代码变为:

        PermissionUtils.permission(“android.permission-group.CAMERA”)
                .callback(new PermissionUtils.SimpleCallback() {
                    @Override
                    public void onGranted() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onDenied() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();

                    }
                })
                .request();

组件B的源码跟A相同,组件B编译后aar的代码变为:

        PermissionUtils.permission(“CAMERA”)
                .callback(new PermissionUtils.SimpleCallback() {
                    @Override
                    public void onGranted() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请成功", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onDenied() {
                        Toast.makeText(UtilsTestActivity.this, "权限申请失败", Toast.LENGTH_SHORT).show();

                    }
                })
                .request();

这里你也应该发现问题所在了吧,解决的办法是把1.29.0中PermissionConstants.CAMERA重新改为1.23.7中的定义,其他并集的字符串常量同理

0

哦哦,了解了,library 在编译为 class 的时候会把常量直接编译进去,这就需要你把 A 库升一下级了,学到了。