getActivity / XXPermissions

Android 权限请求框架,已适配 Android 14
Apache License 2.0
5.44k stars 735 forks source link

[Bug]:兼容性没做好,引发崩溃,使用Android13的代码,运行在Android12设备上不向下兼容 #272

Closed pichsy closed 3 weeks ago

pichsy commented 2 months ago

框架版本【必填】

18.3

问题描述【必填】

兼容性没做好,引发崩溃,使用Android13的代码,运行在Android12设备上不向下兼容

复现步骤【必填】

使用Android13的代码,运行在Android12设备上不向下兼容,

XXPermissions.with(this)
        .unchecked()
        .permission(Permission.READ_MEDIA_IMAGES)
        .permission(Permission.READ_MEDIA_VIDEO)
        .permission(Permission.READ_MEDIA_AUDIO)
        .permission(Permission.MANAGE_EXTERNAL_STORAGE)
        .request { permissions, all ->
            if (all) {

            } else {

            }
        }

是否必现【必填】

项目 targetSdkVersion【必填】

33

出现问题的手机信息【必填】

荣耀30pro

出现问题的安卓版本【必填】

12

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

所有

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

Process: com.pichs.shanhai, PID: 14413
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pichs.shanhai/com.pichs.shanhai.MainActivity}: java.lang.IllegalArgumentException: If you have applied for MANAGE_EXTERNAL_STORAGE permissions, do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4765)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4983)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3059)
    at android.os.Handler.dispatchMessage(Handler.java:117)
    at android.os.Looper.loopOnce(Looper.java:205)
    at android.os.Looper.loop(Looper.java:293)
    at android.app.ActivityThread.loopProcess(ActivityThread.java:9934)
    at android.app.ActivityThread.main(ActivityThread.java:9923)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
Caused by: java.lang.IllegalArgumentException: If you have applied for MANAGE_EXTERNAL_STORAGE permissions, do not apply for the READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE permissions
    at com.hjq.permissions.PermissionChecker.optimizeDeprecatedPermission(PermissionChecker.java:687)
    at com.hjq.permissions.XXPermissions.request(XXPermissions.java:192)
    at com.pichs.shanhai.MainActivity.initPermission(MainActivity.kt:46)
    at com.pichs.shanhai.MainActivity.afterOnCreate(MainActivity.kt:24)
    at com.pichs.xbase.binding.AbstractBaseActivity.onCreate(AbstractBaseActivity.kt:26)
    at android.app.Activity.performCreate(Activity.java:8592)
    at android.app.Activity.performCreate(Activity.java:8565)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4733)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4983) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3059) 
    at android.os.Handler.dispatchMessage(Handler.java:117) 
    at android.os.Looper.loopOnce(Looper.java:205) 
    at android.os.Looper.loop(Looper.java:293) 
    at android.app.ActivityThread.loopProcess(ActivityThread.java:9934) 
    at android.app.ActivityThread.main(ActivityThread.java:9923) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240) 

提供截图或视频

No response

提供解决方案

No response

getActivity commented 2 months ago

小伙子,我不是很懂你的操作,你既然申请了 MANAGE_EXTERNAL_STORAGE 权限,就已经有所有文件的管理权限了,为什么还要去申请 READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO 这几个媒体权限?

getActivity commented 2 months ago

XXPermissions-18.62.aar.zip

getActivity commented 2 months ago

小伙子,根据你的反馈,我发现了一个问题,你调用了 unchecked 方法,理论上不应该出现框架抛出的异常,在这里我做了一些优化,你可以下载上面的 aar 包测试一下。

sudot commented 2 months ago

我今天也发现这个问题。红米k30SU。

我看了另一个 issue:[Bug]:一个荣耀手机鸿蒙系统7.0.0.191的兼容问题 #269,也是和这个问题一致的。

Screenshot_2024-03-22-18-37-37-586_com android settings

我来说明一下为什么要同时申请这两个权限。

只申请 MANAGE_EXTERNAL_STORAGE 权限,会自动跳转到所有文件管理权限授权页面去授权。 但是授权回来后,点开应用管理,权限管理,会发现“文件和文档”权限是禁用的。所以还要引导用户去开启此权限。 这时候,只要随便申请一个和媒体相关的一个权限就可以了。

Screenshot_2024-03-22-18-41-32-215_com android settings Screenshot_2024-03-22-18-41-54-358-edit_com miui securitycenter

我现在的解决方案是,将这两个权限分成两次单独申请,就绕过了你的 checkStoragePermission 代码。

getActivity commented 1 month ago

@sudot 小伙子,你获取了所有文件管理权限,理论上是不需要申请媒体权限,就可以直接读取文件和文档的,你是在这个过程遇到了什么问题吗?

sudot commented 1 month ago

@sudot 小伙子,你获取了所有文件管理权限,理论上是不需要申请媒体权限,就可以直接读取文件和文档的,你是在这个过程遇到了什么问题吗?

你这么说确实没毛病,但现实情况就是非要单独申请,而且从这两个 issue 你也发现了,国内的系统不是一家这个样子。 不过你也确实提供了解决办法,我们也只是这样反馈一下,具体如何处理还得是作者自己考量。

getActivity commented 1 month ago

@sudot 小伙子,假设国产的手机确实有这个问题,那么你为什么要同时申请媒体权限和所有文件的管理权限?如果只是为了读取媒体文件的话,直接申请媒体权限不就可以了?为什么还要连带申请所有文件的管理权限?

GitJoBo commented 1 month ago

我这边也遇到了这个问题,需求是需要获取媒体文件,同时还需要写入配置文件到SD卡根目录。

getActivity commented 1 month ago

@GitJoBo 小伙子,获取媒体文件和将配置写入 SD 卡根目录是两码事吧?这两者没有太大的关联性,你为什么不分开两次申请?

getActivity commented 3 weeks ago

长时间没有响应,自动关闭此 issue。