uni-app 三星手机首次访问相册授权后 uni.chooseImage 显示 chooseImage:fail No Permission

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app 三星手机首次访问相册授权后 uni.chooseImage 显示 chooseImage:fail No Permission

操作步骤:

  • 项目【manifest.json配置】
    • <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
    • <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
    • <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    • <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

预期结果:

  • 第一次授权允许后就不能再出现 chooseImage:fail No Permission

实际结果:

  • 第一次访问相册授权点允许后,还是提示 chooseImage:fail No Permission

bug描述:

场景

  • 使用了组件 <uni-file-picker/> 选择手机相册

复现步骤

  1. app安装完后第一次点击选择手机相册,有提示授权(见附件1)
  2. 点击“允许”后就跳到相册(此时控制台报错提示 chooseImage:fail No Permission),进行选择照片
  3. 图片确认选择后,没有回显(因为已经提示 chooseImage:fail No Permission
  4. 再次点击进去选择照片就正常了

设备

  • 只有三星手机有这问题(见附件2)

附件图片

Attachment 1 Attachment 2


1 回复

在处理uni-app在三星手机上首次访问相册授权后可能出现的“chooseImage:fail No Permission”问题时,我们通常需要确保应用已经正确获取了访问相册的权限,并且在权限被授权后能够正确调用uni.chooseImage接口。下面是一个处理这个问题的示例代码,包括权限请求和图片选择的逻辑。

示例代码

  1. 检查并请求权限

首先,我们需要检查应用是否已经获得了访问相册的权限,如果没有,则向用户请求权限。在uni-app中,可以使用plus.android.requestPermissions方法来请求权限。

function requestAlbumPermission() {
    return new Promise((resolve, reject) => {
        const main = plus.android.runtimeMainActivity();
        const context = main.getApplicationContext();
        const pm = context.getPackageManager();
        const packageName = main.getPackageName();
        const permission = "android.permission.READ_EXTERNAL_STORAGE";

        if (pm.checkPermission(permission, packageName) === plus.android.PackageManager.PERMISSION_GRANTED) {
            resolve();
        } else {
            plus.android.requestPermissions([permission], (event) => {
                const granted = event.deniedAlways.indexOf(permission) === -1 && event.granted.indexOf(permission) !== -1;
                if (granted) {
                    resolve();
                } else {
                    reject(new Error("Permission denied"));
                }
            });
        }
    });
}
  1. 调用uni.chooseImage

在确认已经获得权限后,我们可以安全地调用uni.chooseImage

async function chooseImage() {
    try {
        await requestAlbumPermission();
        uni.chooseImage({
            count: 9,
            sizeType: ['original', 'compressed'],
            sourceType: ['album', 'camera'],
            success: (res) => {
                console.log('Chosen images:', res.tempFilePaths);
                // 处理选择的图片
            },
            fail: (err) => {
                console.error('Failed to choose image:', err);
            }
        });
    } catch (error) {
        console.error('Permission request failed:', error);
        // 处理权限请求失败的情况,例如向用户显示提示信息
    }
}

// 调用函数
chooseImage();

注意事项

  • 上述代码在Android平台上使用plus对象,这是DCloud提供的扩展API,确保你的项目已经正确配置了uni-app的Android支持。
  • 在实际应用中,你可能需要更细致地处理权限请求的结果,例如当用户永久拒绝权限时,向用户显示适当的提示信息。
  • 对于iOS平台,权限请求的逻辑会有所不同,通常使用uni.authorize方法。

通过以上代码,你可以确保在三星手机上首次访问相册授权后,uni.chooseImage能够正确执行。

回到顶部