XXPermissions icon indicating copy to clipboard operation
XXPermissions copied to clipboard

[Bug]:拒绝权限后,再申请权限,launchPermissionRequest 这里还是会走

Open xuexirong opened this issue 8 months ago • 13 comments

框架版本【必填】

22.0

问题描述【必填】

拒绝权限后,再申请权限,launchPermissionRequest 这里还是会走,导致我这个权限提示的弹框会闪一下再消失

复现步骤【必填】

申请一个权限,彻底拒绝后,再继续申请

是否必现【必填】

项目 targetSdkVersion【必填】

35

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

小米

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

15

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

自己遇到的

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

目前手头只有小米测试机,其他手机没测

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

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

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

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

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

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

提供报错堆栈

fun requestCache(
        activity: FragmentActivity,
        permission: String,
        callback: PermissionCallback? = null
    ) {
        mCallback = callback
        mActivity = activity
        // 判断权限是否处于不再询问状态
        if (!XXPermissions.isGrantedPermissions(mActivity, permission)) {
            XXPermissions.with(activity)
                // 申请单个权限
                .permission(permission)
                // 设置权限请求拦截器(局部设置)
                //.interceptor(PermissionInterceptor())
                // 设置不触发错误检测机制(局部设置)
                //.unchecked()
                .interceptor(object : OnPermissionInterceptor {
                    override fun launchPermissionRequest(
                        activity: Activity,
                        fragmentFactory: PermissionFragmentFactory<*, *>,
                        requestPermissions: List<String?>,
                        callback: OnPermissionCallback?
                    ) {
                        super.launchPermissionRequest(
                            activity,
                            fragmentFactory,
                            requestPermissions,
                            callback
                        )
                        val title = mActivity.getString(R.string.permission_storage_title)
                        val explain = mActivity.getString(R.string.permission_storage_content)
                        PermissionPopUtil.show(mActivity, title, explain)
                    }
                })
                .request(object : OnPermissionCallback {

                    override fun onGranted(permissions: MutableList<String>, allGranted: Boolean) {
                        mCallback?.onSuccess()
                        PermissionPopUtil.hide()
                        /*toast("获取录音和日历权限成功")*/
                    }

                    override fun onDenied(
                        permissions: MutableList<String>,
                        doNotAskAgain: Boolean
                    ) {
                        PermissionPopUtil.hide()
                        mCallback?.onFail(doNotAskAgain)
                        toast(R.string.permission_open_toast)
                    }
                })
        } else {
            //Toast.makeText(this, "权限已被授予!", Toast.LENGTH_SHORT).show();
            mCallback?.onSuccess()
        }
    }

里面这个PermissionPopUtil就是我的弹框组件

提供截图或视频

No response

提供解决方案

No response

xuexirong avatar May 28 '25 08:05 xuexirong

XXPermissions-22.2.aar.zip

看了一下框架的 Demo 工程也有这个问题,目前我针对这个问题进行了优化,你下载上面的 aar 包看看有无解决?解决了的话请告知我一声,我发布一下远程依赖。

getActivity avatar May 28 '25 10:05 getActivity

@getActivity 没解决

xuexirong avatar May 29 '25 02:05 xuexirong

@xuexirong 你试一下 Demo 工程是否有这个问题?

getActivity avatar May 29 '25 05:05 getActivity

https://github.com/user-attachments/assets/87cd309a-a5fc-415c-bd74-f778fcd75e19 @getActivity

xuexirong avatar May 29 '25 05:05 xuexirong

@xuexirong 你重新拉一下代码,再跑一下 Demo 工程

getActivity avatar May 29 '25 05:05 getActivity

@getActivity 拉了,还是有问题

xuexirong avatar May 29 '25 06:05 xuexirong

Image

你在拦截器中是不能直接显示 PopupWindow 的,而是要延迟一段时间再判断要不要显示,Demo 上面有这块的示例,这个你知道吗?

getActivity avatar May 29 '25 10:05 getActivity

@getActivity 拉了,还是有问题

我试了是没有问题的,你确定用的是 Github 上面最新的原封不动 Demo 工程做测试的?

getActivity avatar May 29 '25 10:05 getActivity

@getActivity 把你的demo改成了延迟1000可以了,看来就是300毫秒在某些手机或者某些时候不够用

xuexirong avatar May 29 '25 10:05 xuexirong

@getActivity 把你的demo改成了延迟1000可以了,看来就是300毫秒在某些手机或者某些时候不够用

怎么可能需要 1000 毫秒?我在最新版本框架上面不是优化了这个时长?怎么还需要那么久?我自己在小米 12 Android 12 上面测试,300 毫秒足够应对的。

getActivity avatar May 29 '25 10:05 getActivity

@getActivity 我只设置了1000,明天再试试其他值,我用的是小米12s pro,安卓15,澎湃os2.0.8.0,我真的拉的最新代码,因为本地之前没有你的项目,项目刚启动下载东西还跑了挺长时间呢

xuexirong avatar May 29 '25 10:05 xuexirong

@getActivity 试了,我的手机350ms可以,300ms不行

xuexirong avatar May 30 '25 02:05 xuexirong

@xuexirong 小伙子,有一个不幸的消息,框架 22.0 和 22.2 版本存在严重的 Bug(我在 2025 年 5 月 30 日晚上在 jitpack 手动删除了这两个版本的远程依赖),在 Android 6.0 的设备判断存储相关的权限会出现崩溃,目前我已经在修复了该问题,并且对所有的 Android 版本进行了覆盖测试,请你尽快更新到 23.0 版本。

getActivity avatar May 31 '25 15:05 getActivity

加延时有个极端场景会有问题,如果用户点同意太快,popwindow还没展示权限就申请完了,审核会认为没有弹说明弹窗。被华为打回来一次,看了录屏才知道审核操作太快了

charmeleon2 avatar Jul 16 '25 08:07 charmeleon2

加延时有个极端场景会有问题,如果用户点同意太快,popwindow还没展示权限就申请完了,审核会认为没有弹说明弹窗。被华为打回来一次,看了录屏才知道审核操作太快了

这个问题应该是华为的问题吧?300 毫秒等于 0.3 秒,如果能够在这个时间内点击,则证明这个操作肯定不是手点的,但是这样是不对的,权限解释弹窗应当延迟显示,否则会导致有些权限申请系统会立马同意,但是权限解释弹窗会一闪而过的效果。

getActivity avatar Jul 16 '25 09:07 getActivity

加延时有个极端场景会有问题,如果用户点同意太快,popwindow还没展示权限就申请完了,审核会认为没有弹说明弹窗。被华为打回来一次,看了录屏才知道审核操作太快了

这个问题应该是华为的问题吧?300 毫秒等于 0.3 秒,如果能够在这个时间内点击,则证明这个操作肯定不是手点的,但是这样是不对的,权限解释弹窗应当延迟显示,否则会导致有些权限申请系统会立马同意,但是权限解释弹窗会一闪而过的效果。

例如申请权限组,如果你之前同意了读取外部存储权限的情况下,但是这次你申请了外部存储读写两个权限,框架在判断的时候,读的权限已经授予,但是写的权限还没有授予,此时就会发起权限申请,但是这个时候系统并不会弹出系统授权弹窗,而是直接同意授予权限,这个时候就会出现刚刚说的权限解释弹窗出现一闪而过的问题。

getActivity avatar Jul 16 '25 09:07 getActivity

加延时有个极端场景会有问题,如果用户点同意太快,popwindow还没展示权限就申请完了,审核会认为没有弹说明弹窗。被华为打回来一次,看了录屏才知道审核操作太快了

这个问题应该是华为的问题吧?300 毫秒等于 0.3 秒,如果能够在这个时间内点击,则证明这个操作肯定不是手点的,但是这样是不对的,权限解释弹窗应当延迟显示,否则会导致有些权限申请系统会立马同意,但是权限解释弹窗会一闪而过的效果。

是华为的问题,但是咱又不能跟华为去理论,只能应用侧调下延迟

charmeleon2 avatar Jul 16 '25 09:07 charmeleon2

加延时有个极端场景会有问题,如果用户点同意太快,popwindow还没展示权限就申请完了,审核会认为没有弹说明弹窗。被华为打回来一次,看了录屏才知道审核操作太快了

这个问题应该是华为的问题吧?300 毫秒等于 0.3 秒,如果能够在这个时间内点击,则证明这个操作肯定不是手点的,但是这样是不对的,权限解释弹窗应当延迟显示,否则会导致有些权限申请系统会立马同意,但是权限解释弹窗会一闪而过的效果。

是华为的问题,但是咱又不能跟华为去理论,只能应用侧调下延迟

@charmeleon2 你不要管华为有没有认同你的看法,先反馈上去再说,你有反馈这个问题才有可能改,你没有反馈基本不太可能会改。

getActivity avatar Jul 16 '25 23:07 getActivity