uni-app 安卓低版本频繁提示授权拒绝后重新授权问题

uni-app 安卓低版本频繁提示授权拒绝后重新授权问题

项目属性
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 win10
HBuilderX类型 正式
HBuilderX版本号 3.4.7
手机系统 Android
手机系统版本号 Android 8.1
手机厂商 华为
手机机型 DUB-Al00a
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:win10

HBuilderX类型:正式

HBuilderX版本号:3.4.7

手机系统:Android

手机系统版本号:Android 8.1

手机厂商:华为

手机机型:DUB-Al00a

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

App下载地址或H5网址: https://www.himxr.com/mxr/download/mxr.apk

示例代码:

/* android打包配置 */
"permissions" : [
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
"<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>",
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>"
],
"permissionPhoneState" : {
"request" : "none", //once always
"prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"
},
/* 申请获取手机存储权限 */
"permissionExternalStorage" : {
"request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
}

操作步骤:

见附件视频

预期结果:

应该点击拒绝之后就不再弹出授权提示

实际结果:

点击拒绝之后还是会弹出再此授权提示。

bug描述:

用户拒绝权限以后一直频繁再次提示用户授权,目前在低版本安卓系统中会存在该问题。 上架小米时一直提示:频繁过度获取用户隐私信息。 详情视频复现见附件

附件:


更多关于uni-app 安卓低版本频繁提示授权拒绝后重新授权问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

我也遇到了这个问题 请问您那个问题解决了吗

更多关于uni-app 安卓低版本频繁提示授权拒绝后重新授权问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


请问有人解决了吗

“permissionPhoneState” : { “request” : “none”, //once always “prompt” : “为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。” }, / 申请获取手机存储权限 / “permissionExternalStorage” : { “request” : “none”, “prompt” : “应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。” }, 设置none也不生效

uni-app 开发中,安卓低版本设备上频繁提示授权拒绝后重新授权的问题,通常是由于权限请求的逻辑处理不当或安卓系统的权限管理机制导致的。以下是一些可能的解决方案:

1. 检查权限请求逻辑

确保在请求权限时,正确处理了用户拒绝授权的情况。如果用户拒绝了权限请求,不要立即再次请求,而是引导用户到设置页面手动开启权限。

uni.authorize({
    scope: 'scope.userLocation',
    success() {
        // 授权成功
    },
    fail(res) {
        if (res.errMsg.indexOf('auth deny') !== -1) {
            // 用户拒绝了授权
            uni.showModal({
                title: '提示',
                content: '您拒绝了位置权限,是否前往设置页面开启?',
                success(res) {
                    if (res.confirm) {
                        uni.openSetting({
                            success(settingRes) {
                                console.log(settingRes.authSetting);
                            }
                        });
                    }
                }
            });
        }
    }
});

2. 使用 uni.getSetting 检查权限状态

在请求权限之前,先使用 uni.getSetting 检查当前权限状态,避免重复请求。

uni.getSetting({
    success(res) {
        if (!res.authSetting['scope.userLocation']) {
            // 未授权,请求权限
            uni.authorize({
                scope: 'scope.userLocation',
                success() {
                    // 授权成功
                },
                fail(res) {
                    if (res.errMsg.indexOf('auth deny') !== -1) {
                        // 用户拒绝了授权
                        uni.showModal({
                            title: '提示',
                            content: '您拒绝了位置权限,是否前往设置页面开启?',
                            success(res) {
                                if (res.confirm) {
                                    uni.openSetting({
                                        success(settingRes) {
                                            console.log(settingRes.authSetting);
                                        }
                                    });
                                }
                            }
                        });
                    }
                }
            });
        } else {
            // 已授权
        }
    }
});

3. 避免频繁请求权限

在用户拒绝授权后,避免在短时间内再次请求权限。可以通过设置一个标志位或使用 uni.showModal 提示用户手动开启权限。

let hasRequestedPermission = false;

function requestPermission() {
    if (hasRequestedPermission) return;

    uni.authorize({
        scope: 'scope.userLocation',
        success() {
            // 授权成功
        },
        fail(res) {
            if (res.errMsg.indexOf('auth deny') !== -1) {
                // 用户拒绝了授权
                hasRequestedPermission = true;
                uni.showModal({
                    title: '提示',
                    content: '您拒绝了位置权限,是否前往设置页面开启?',
                    success(res) {
                        if (res.confirm) {
                            uni.openSetting({
                                success(settingRes) {
                                    console.log(settingRes.authSetting);
                                }
                            });
                        }
                    }
                });
            }
        }
    });
}

4. 处理安卓低版本的特殊情况

安卓低版本设备可能存在权限管理机制的不同,建议在低版本设备上增加额外的提示或引导用户手动开启权限。

const systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === 'android' && systemInfo.system.toLowerCase().indexOf('android 5') !== -1) {
    // 针对安卓低版本的特殊处理
    uni.showModal({
        title: '提示',
        content: '您的设备版本较低,请手动开启位置权限以确保功能正常使用。',
        success(res) {
            if (res.confirm) {
                uni.openSetting({
                    success(settingRes) {
                        console.log(settingRes.authSetting);
                    }
                });
            }
        }
    });
}

5. 使用 uni.addInterceptor 拦截权限请求

通过 uni.addInterceptor 拦截权限请求,统一处理权限请求的逻辑。

uni.addInterceptor('authorize', {
    invoke(args) {
        // 在请求权限前做一些处理
    },
    success(res) {
        // 权限请求成功后的处理
    },
    fail(res) {
        // 权限请求失败后的处理
        if (res.errMsg.indexOf('auth deny') !== -1) {
            uni.showModal({
                title: '提示',
                content: '您拒绝了权限,是否前往设置页面开启?',
                success(res) {
                    if (res.confirm) {
                        uni.openSetting({
                            success(settingRes) {
                                console.log(settingRes.authSetting);
                            }
                        });
                    }
                }
            });
        }
    }
});
回到顶部