uni-app uni.chooseImage拍照获取权限时 小米手机拒绝后重复弹窗

uni-app uni.chooseImage拍照获取权限时 小米手机拒绝后重复弹窗

开发环境 版本号 项目创建方式
Mac - HBuilderX
Android Android 11 -
HBuilderX 3.4.7 -
Vue vue2 -

示例代码:

uploadImg() {
let that = this;
uni.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: res => {
uni.showLoading({
title: '正在上传...',
icon: 'loading',
});
// 上传完成后把文件上传到服务器
that.getURl(res.tempFilePaths[0])
},
fail: function(err) {
console.log(err.errMsg);
}
})
}

操作步骤:

触发相机权限必现

预期结果:

wu

实际结果:

wu

bug描述:

uni.chooseImage,拍照获取权限,小米手机拒绝后重复弹窗


更多关于uni-app uni.chooseImage拍照获取权限时 小米手机拒绝后重复弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

目前的设计是权限拒绝两次后将不再申请。应用下次启动会重新记数。

更多关于uni-app uni.chooseImage拍照获取权限时 小米手机拒绝后重复弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html


第一次权限拒绝后,用户不需要任何操作,就会自动弹出授权提醒。

回复 l***@126.com: 这要需要你自行确认下代码行为。看是是不是重复调用相机功能了。功能模块本身不存在自动重复申请权限的。

回复 l***@126.com: 荣耀是拒绝一次后第二次就不弹了 哈哈哈哈

请问你解决了?拒绝后还会弹一次提醒

什么拒绝

应该不是代码问题,华为手机测试没有问题。小米,调用uni.chooseImage后,第一次拒绝 ,就会弹出第二次,一样的授权说明,就和楼主截图一样,出现两次。

您好,请问这个该如何解决 因为这个上架不了

请问你解决了?

同问,这个问题解决了么,貌似只有小米手机有这个问题啊?

在使用 uni.chooseImage API 进行拍照时,如果在小米手机(或其他安卓设备)上用户拒绝了权限请求,可能会遇到权限弹窗重复出现的问题。这是因为安卓系统(特别是 MIUI)在处理权限请求时的一些特殊行为。

解决方案

以下是一些可能的解决方案,你可以根据实际情况选择最适合的:

1. 检查权限状态

在调用 uni.chooseImage 之前,先检查相机权限是否已经被授予。如果用户已经拒绝了权限,可以引导用户手动去设置中开启权限,而不是重复弹窗。

uni.getSetting({
    success(res) {
        if (!res.authSetting['scope.camera']) {
            uni.authorize({
                scope: 'scope.camera',
                success() {
                    // 用户已经同意授权,可以调用 uni.chooseImage
                    uni.chooseImage({
                        count: 1,
                        sourceType: ['camera'],
                        success(res) {
                            console.log(res.tempFilePaths);
                        }
                    });
                },
                fail() {
                    // 用户拒绝了授权,提示用户去设置中手动开启权限
                    uni.showModal({
                        title: '提示',
                        content: '需要相机权限才能拍照,是否去设置中开启?',
                        success(res) {
                            if (res.confirm) {
                                uni.openSetting();
                            }
                        }
                    });
                }
            });
        } else {
            // 用户已经授权,直接调用 uni.chooseImage
            uni.chooseImage({
                count: 1,
                sourceType: ['camera'],
                success(res) {
                    console.log(res.tempFilePaths);
                }
            });
        }
    }
});

2. 处理用户拒绝后的逻辑

如果用户拒绝了权限请求,可以在 fail 回调中处理相应的逻辑,避免重复弹窗。例如,提示用户去设置中手动开启权限,或者直接结束操作。

uni.chooseImage({
    count: 1,
    sourceType: ['camera'],
    success(res) {
        console.log(res.tempFilePaths);
    },
    fail(err) {
        if (err.errMsg.includes('auth deny')) {
            uni.showModal({
                title: '提示',
                content: '需要相机权限才能拍照,是否去设置中开启?',
                success(res) {
                    if (res.confirm) {
                        uni.openSetting();
                    }
                }
            });
        }
    }
});

3. 使用 uni.showActionSheet 引导用户选择

在调用 uni.chooseImage 之前,可以使用 uni.showActionSheet 让用户选择是从相册选择图片还是拍照。如果用户选择拍照,再检查相机权限。

uni.showActionSheet({
    itemList: ['从相册选择', '拍照'],
    success(res) {
        if (res.tapIndex === 0) {
            // 从相册选择
            uni.chooseImage({
                count: 1,
                sourceType: ['album'],
                success(res) {
                    console.log(res.tempFilePaths);
                }
            });
        } else if (res.tapIndex === 1) {
            // 拍照
            uni.getSetting({
                success(res) {
                    if (!res.authSetting['scope.camera']) {
                        uni.authorize({
                            scope: 'scope.camera',
                            success() {
                                uni.chooseImage({
                                    count: 1,
                                    sourceType: ['camera'],
                                    success(res) {
                                        console.log(res.tempFilePaths);
                                    }
                                });
                            },
                            fail() {
                                uni.showModal({
                                    title: '提示',
                                    content: '需要相机权限才能拍照,是否去设置中开启?',
                                    success(res) {
                                        if (res.confirm) {
                                            uni.openSetting();
                                        }
                                    }
                                });
                            }
                        });
                    } else {
                        uni.chooseImage({
                            count: 1,
                            sourceType: ['camera'],
                            success(res) {
                                console.log(res.tempFilePaths);
                            }
                        });
                    }
                }
            });
        }
    }
});
回到顶部