uni-app 请求授权相册媒体访问权限没有弹系统授权弹窗
uni-app 请求授权相册媒体访问权限没有弹系统授权弹窗
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | macOS Sequoia 15.2 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
手机系统:Android
手机系统版本号:Android 15
手机厂商:小米
手机机型:小米15
页面类型:vue
vue版本:vue3
打包方式:云端
示例代码:
checkPermission('STORAGE', REFUSE_TEXT.avatar_strong, per_pop_up.value).then(res => {
if (res) {
uni.chooseImage({
count: 1,
success: (res) => {
const {tempFilePaths} = res
const avatarUrl = tempFilePaths[0]
changeAvatar(avatarUrl)
}
})
}
})
// 检查是否授权 请求授权
export function checkPermission(permissionID, permission_text_list, per_pop_up) {
return new Promise((resolve) => {
// #ifndef APP-PLUS
resolve(true)
// #endif
// #ifdef APP-PLUS
const ANDROID_PERMISSIONS = {
'STORAGE_11': ['android.permission.READ_EXTERNAL_STORAGE', 'android.permission.WRITE_EXTERNAL_STORAGE'],
'STORAGE_13': ['android.permission.READ_MEDIA_IMAGES'],
'STORAGE_14': ['android.permission.READ_MEDIA_VISUAL_USER_SELECTED']
}
if (permissionID === 'STORAGE') {
const android_version = getAndroidVersion()
if (android_version >= 34) {
permissionID = 'STORAGE_14'
} else if (android_version === 33) {
permissionID = 'STORAGE_13'
} else {
permissionID = 'STORAGE_11'
}
}
const permissions = ANDROID_PERMISSIONS[permissionID]
// 检查是否有权限
let hadPermission = 0
try {
const main = plus.android.runtimeMainActivity()
const ContextCompat = plus.android.importClass('androidx.core.content.ContextCompat')
// 调用 ContextCompat.checkSelfPermission 返回 0(有权限)或 -1(没权限)
for (let i = 0; i < permissions.length; i++) {
hadPermission = ContextCompat.checkSelfPermission(main, permissions[i])
if (hadPermission !== 0) { // 如果有一个权限没有授权,就跳出循环
break
}
}
} catch (e) {
resolve(false)
}
if (hadPermission !== 0) {
// 未授权 弹窗提示使用权限说明 请求权限授权
per_pop_up.openPerPopUp(permission_text_list[2], permission_text_list[3])
// 未授权 请求权限
let result = false
plus.android.requestPermissions(permissions, function (e) {
if (e.deniedAlways.length > 0) { //权限被永久拒绝
console.log('Always Denied!!! ' + e.deniedAlways.toString())
}
if (e.deniedPresent.length > 0) { //权限被临时拒绝
console.log('Present Denied!!! ' + e.deniedPresent.toString())
}
if (e.granted.length > 0) { //权限被允许
console.log('Present success!!! ' + e.granted.toString())
result = true
}
if (result) {
// 授权成功 关闭弹窗
per_pop_up.closePerPopUp()
} else {
// 授权失败 弹窗让用户手动去设置授权
showAndroidPermissionModel(permission_text_list[1], per_pop_up)
}
resolve(result)
}, function (e) {
console.log('Request Permissions error:' + JSON.stringify(e))
resolve(false)
})
} else {
resolve(true)
}
// #endif
})
}
操作步骤:
点击头像检查是否授权相册媒体访问权限
预期结果:
没有授权则请求权限,弹出系统弹窗授权
实际结果:
直接拒绝了授权,并没有弹出系统的授权弹窗
bug描述:
android15版本的手机,请求授权直接拒绝了授权并没有弹出系统授权的弹窗,用android11手机测试能正常弹出。测试过其他的权限,比如相机权限的授权,无论什么版本的android都能正常弹出系统授权,但是就是媒体访问权限android.permission.READ_MEDIA_VISUAL_USER_SELECTED不行
更多关于uni-app 请求授权相册媒体访问权限没有弹系统授权弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app 请求授权相册媒体访问权限没有弹系统授权弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在Android 14+系统上,相册权限的授权机制发生了变化。根据你的代码分析,问题出现在Android 15设备上请求READ_MEDIA_VISUAL_USER_SELECTED权限时。
Android 14开始引入了部分媒体访问权限,READ_MEDIA_VISUAL_USER_SELECTED是选择性照片访问权限,需要配合其他权限使用。建议修改权限请求逻辑:
const ANDROID_PERMISSIONS = {
'STORAGE_14': ['android.permission.READ_MEDIA_IMAGES', 'android.permission.READ_MEDIA_VISUAL_USER_SELECTED']
}
将两个权限同时请求,因为READ_MEDIA_VISUAL_USER_SELECTED需要基础的照片访问权限作为前提。另外,检查AndroidManifest.xml中是否声明了对应的权限:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />

