高版本android请求相册授权在uni-app中无法拉起系统授权弹窗
高版本android请求相册授权在uni-app中无法拉起系统授权弹窗
示例代码:
不同版本的android会设置不同的请求权限,不知道是否跟这个有关系
STORAGE_11是android API level < 33 设置的请求权限
STORAGE_13是android API level = 33 设置的请求权限
STORAGE_14是android API level >= 34 设置的请求权限
具体代码实现可以看看附件
```javascript
const ANDROID_PERMISSIONS = {
// 摄像头权限
CAMERA: 'android.permission.CAMERA',
// 存储权限
STORAGE_11: {
// 存储读取权限
READ: 'android.permission.READ_EXTERNAL_STORAGE',
// 存储写入权限
WRITE: 'android.permission.WRITE_EXTERNAL_STORAGE',
},
STORAGE_13: 'android.permission.READ_MEDIA_IMAGES',
STORAGE_14: 'android.permission.READ_MEDIA_VISUAL_USER_SELECTED',
}
```
## 操作步骤:
高版本android点击头像上传图片请求授权
## 预期结果:
拉起相机授权,拉起相册授权
## 实际结果:
成功拉起相机授权,但是相册授权没拉起,直接拒绝了相册的授权
## bug描述:
点击上传头像,会先请求相机授权,正常弹出相机的系统授权弹窗,相机授权成功之后会请求相册权限,这个时候,如果是低版本的android能成功拉起相册授权的系统授权弹窗,但是高版本的android不会拉起授权弹窗,会直接拒绝掉相册的授权。
测试:
高版本的android15,相册拉不起授权,可以看图片1/2(图1是相机授权,图2是相册授权没拉起系统授权弹窗)
低版本的android11,测试结果都正常,可以看图片3/4(图3是相机授权,图4是相册授权)
代码上传了附件
demo.zip下载地址:[demo.zip](https://ask.dcloud.net.cn/file/download/file_name-ZGVtby56aXA=__url-Ly9pbWctY2RuLXRjLmRjbG91ZC5uZXQuY24vdXBsb2Fkcy9xdWVzdGlvbnMvMjAyNTA4MjcvOWJkNGIxM2FmOWMzOTU2YzQwMTU5YzJjNDE4MmI2NGI=)
## 图片




更多关于高版本android请求相册授权在uni-app中无法拉起系统授权弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
5 回复
你试下直接同时请求,用权限列表
更多关于高版本android请求相册授权在uni-app中无法拉起系统授权弹窗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
加上WRITE_EXTERNAL_STORAGE能正常拉起了
回复 祖国的杂草: 行
在高版本Android(API level 33+)中,相册权限管理策略发生了变化,导致无法直接拉起系统授权弹窗。根据Android官方要求,从API level 33开始,READ_EXTERNAL_STORAGE权限被细化为媒体类型权限,包括READ_MEDIA_IMAGES(API 33)和READ_MEDIA_VISUAL_USER_SELECTED(API 34)。
问题原因:
- 权限声明不匹配:高版本Android需要请求新的媒体权限,而非传统的存储权限。
- 权限请求逻辑未适配:代码中可能未正确区分Android版本并动态请求对应权限。
解决方案:
- 在
manifest.json中声明所有可能的权限:
{
"permissions": [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
]
}
- 在运行时动态检测Android版本并请求对应权限:
function requestStoragePermission() {
const systemInfo = uni.getSystemInfoSync();
const apiLevel = systemInfo.platformVersion;
if (apiLevel >= 34) {
// Android 14+
uni.authorize({
scope: 'scope.READ_MEDIA_VISUAL_USER_SELECTED',
success: () => console.log('授权成功'),
fail: () => console.log('授权失败')
});
} else if (apiLevel >= 33) {
// Android 13
uni.authorize({
scope: 'scope.READ_MEDIA_IMAGES',
success: () => console.log('授权成功'),
fail: () => console.log('授权失败')
});
} else {
// Android 12及以下
uni.authorize({
scope: 'scope.writePhotosAlbum',
success: () => console.log('授权成功'),
fail: () => console.log('授权失败')
});
}
}


