uni-app 三星手机首次访问相册授权后 uni.chooseImage 显示 chooseImage:fail No Permission
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/>
选择手机相册
复现步骤
- app安装完后第一次点击选择手机相册,有提示授权(见附件1)
- 点击“允许”后就跳到相册(此时控制台报错提示
chooseImage:fail No Permission
),进行选择照片 - 图片确认选择后,没有回显(因为已经提示
chooseImage:fail No Permission
) - 再次点击进去选择照片就正常了
设备
- 只有三星手机有这问题(见附件2)
附件图片
1 回复
在处理uni-app在三星手机上首次访问相册授权后可能出现的“chooseImage:fail No Permission”问题时,我们通常需要确保应用已经正确获取了访问相册的权限,并且在权限被授权后能够正确调用uni.chooseImage
接口。下面是一个处理这个问题的示例代码,包括权限请求和图片选择的逻辑。
示例代码
- 检查并请求权限
首先,我们需要检查应用是否已经获得了访问相册的权限,如果没有,则向用户请求权限。在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"));
}
});
}
});
}
- 调用
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
能够正确执行。