高版本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=)

## 图片

![Image 1](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20250827/2a41ec52a9fbe12dadeb067e5f517a18.jpg)  
![Image 2](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20250827/a49fd3f8f1af8ee204ede14c95f0bbec.jpg)  
![Image 3](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20250827/c059808e8771be62f669c021e07082d0.jpg)  
![Image 4](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20250827/7e5b14259337007a0a1e6ae693af5462.jpg)

更多关于高版本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能正常拉起了

回复 祖国的杂草: 行

可以试试这个相册选择插件https://ext.dcloud.net.cn/plugin?id=20793 支持高版本安卓,自动同步权限说明。

在高版本Android(API level 33+)中,相册权限管理策略发生了变化,导致无法直接拉起系统授权弹窗。根据Android官方要求,从API level 33开始,READ_EXTERNAL_STORAGE权限被细化为媒体类型权限,包括READ_MEDIA_IMAGES(API 33)和READ_MEDIA_VISUAL_USER_SELECTED(API 34)。

问题原因:

  1. 权限声明不匹配:高版本Android需要请求新的媒体权限,而非传统的存储权限。
  2. 权限请求逻辑未适配:代码中可能未正确区分Android版本并动态请求对应权限。

解决方案:

  1. manifest.json中声明所有可能的权限:
{
  "permissions": [
    "android.permission.READ_EXTERNAL_STORAGE",
    "android.permission.READ_MEDIA_IMAGES",
    "android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
  ]
}
  1. 在运行时动态检测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('授权失败')
    });
  }
}
回到顶部