问题
- 用户点击上传图片按钮
- 系统弹出授权提示,用户点击"允许"
- 打开相册并选择图片
- 返回页面后,
uni.chooseImage
的回调返回报错{ code: 12, msg: 'chooseImage:fail No Permission' }
此问题通常只会在首次调用时发生,第二次及以后调用通常正常。
解决方案
我们可以在调用 uni.chooseImage
之前,手动请求 Android 的读取图片权限。这样可以确保授权结果真正生效,避免首次失败,下面权限请求封装函数是抄的uniapp插件市场 链接
权限请求封装函数
javascript
function requestAndroidPermission(permissionID) {
return new Promise(resolve => {
plus.android.requestPermissions(
[permissionID],
function (resultObj) {
console.log('PermissionUtil', '请求权限结果', resultObj)
let result = 0
for (let i = 0; i < resultObj.granted.length; i++) {
let grantedPermission = resultObj.granted[i]
console.log('PermissionUtil', '已获取的权限:' + grantedPermission)
result = 1
}
for (let i = 0; i < resultObj.deniedPresent.length; i++) {
let deniedPresentPermission = resultObj.deniedPresent[i]
console.log('PermissionUtil', '拒绝本次申请的权限:' + deniedPresentPermission)
result = 0
}
for (let i = 0; i < resultObj.deniedAlways.length; i++) {
let deniedAlwaysPermission = resultObj.deniedAlways[i]
console.log('PermissionUtil', '永久拒绝申请的权限:' + deniedAlwaysPermission)
result = -1
}
resolve(result)
},
function (error) {
console.log('PermissionUtil', '申请权限错误:' + error.code + ' = ' + error.message)
resolve({
code: error.code,
message: error.message
})
}
)
})
}
调用选择图片前先申请权限
javascript
const chooseImage = async () => {
const res = await requestAndroidPermission('android.permission.READ_MEDIA_IMAGES')
if (res === 1) {
uni.chooseImage({
count: 3,
sizeType: ['original'],
sourceType: ['album'],
success: res => {
console.log('选择成功:', res)
// 在这里处理选择的图片
},
fail: function (err) {
console.error('选择图片失败:', err)
}
})
} else if (res === 0) {
uni.showToast({
title: '已拒绝访问相册权限',
icon: 'none'
})
} else if (res === -1) {
uni.showToast({
title: '请在系统设置中手动开启相册权限',
icon: 'none'
})
}
}