uni-app 安卓拒绝拨打电话权限后不停闪屏

uni-app 安卓拒绝拨打电话权限后不停闪屏

开发环境 版本号 项目创建方式
Mac 11.4 CLI
产品分类:uniapp/App

PC开发环境操作系统:Mac

手机系统:Android

手机系统版本号:Android 10

手机厂商:华为

手机机型:P40

页面类型:vue

打包方式:离线

CLI版本号:2.0.0-31920210709003

操作步骤:
初次安装拒绝所有权限,包括拨打电话权限。  
此问题是华为审核人员发现的。

预期结果:
拒绝权限后正常使用

实际结果:
APP闪屏,无法继续使用

bug描述:
离线打包,权限里带了拨打电话权限  

<uses-permission android:name="android.permission.CALL_PHONE" />  

安装完启动后,拒绝拨打电话权限,APP不断闪屏  

尝试从配置里去掉此权限后恢复正常,但app里无法继续使用拨打电话功能。

更多关于uni-app 安卓拒绝拨打电话权限后不停闪屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html

17 回复

发重复了

更多关于uni-app 安卓拒绝拨打电话权限后不停闪屏的实战教程也可以访问 https://www.itying.com/category-93-b0.html


暂时忽略此问题,发现闪屏又出现了,可能跟电话权限没直接关系。

发现必须同时开启电话和存储权限才可以使用

是只有这款手机能复现吗?基座可不可以复现?

回复 DCloud_Android_zl: 用oppo r17手机也能复现。 基座因为有额外的权限提示配置(https://ask.dcloud.net.cn/article/36549),不给权限就不让用,但这也只是绕过了这个问题,未根本解决。

华为审核要求拒绝权限后也要能正常使用,其它应用商店暂时没发现这个要求。

回复 appwociao:

华为被拒,反馈信息

我们发现您的应用在用户不同意获取手机识别码敏感权限时,应用强制退出、无法登录/注册、无法进入。

­请参考《审核指南》第7.17相关审核要求:https://developer.huawei.com/consumer/cn/doc/50104

­测试步骤:点击【禁止获取手机识别码权限】模块,应用强制授权(请参考截图/录屏)。

­修改建议:请在用户不同意获取XXX敏感权限时,应用不能自动退出或无法进入。

回复 appwociao: https://ask.dcloud.net.cn/article/36549 可以参考这个文章配置不申请存储权限和手机识别码,需要时自己申请。目前不配置权限的情况下应用是可以正常使用的,建议用最新的HBuilderX重新打包试一下,闪屏的问题麻烦发一个安装包,我这边看一下。

回复 DCloud_Android_zl: 闪屏的问题我私信发你安装包了(未配置强制权限申请)。

回复 DCloud_Android_zl: 尝试配置了启动时不申请权限,但在业务里需要时申请并拒绝后,仍然会出现闪屏情况。

这是一个典型的权限请求时序问题。在 Android 10+ 系统上,应用启动时过早请求敏感权限可能导致权限弹窗与页面渲染冲突,引发闪屏。

解决方案:

  1. 延迟权限请求时机
// 不要在应用启动时立即请求权限
setTimeout(() => {
    uni.authorize({
        scope: 'scope.record',
        success: () => {
            // 授权成功
        },
        fail: () => {
            // 授权失败,正常处理
        }
    })
}, 1000) // 延迟1秒确保页面渲染完成
  1. 按需请求权限 仅在用户触发拨号操作时请求权限:
methods: {
    makePhoneCall() {
        uni.authorize({
            scope: 'scope.record',
            success: () => {
                uni.makePhoneCall({
                    phoneNumber: '10086'
                })
            },
            fail: () => {
                uni.showToast({
                    title: '需要电话权限',
                    icon: 'none'
                })
            }
        })
    }
}
  1. 检查权限状态 在请求前先检查权限状态:
uni.getSetting({
    success: (res) => {
        if (!res.authSetting['scope.record']) {
            // 未授权时再请求
        }
    }
})
回到顶部