【uniapp】uni.chooseImage在Android 13以下机型第一次调用授权后无权限问题

问题

  • 用户点击上传图片按钮
  • 系统弹出授权提示,用户点击"允许"
  • 打开相册并选择图片
  • 返回页面后,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'
    })
  }
}
相关推荐
jingling55510 分钟前
uni-app农场地图——高德 JS API 实现全解析(天地图影像作为layers)
uni-app
CDwenhuohuo31 分钟前
优惠券组件直接用 uview plus
前端·javascript·vue.js
川冰ICE1 小时前
TypeScript装饰器与元编程实战
前端·javascript·typescript
AI砖家1 小时前
Vue3组件传参大全,各种传参方式的对比
前端·javascript·vue.js
希望永不加班1 小时前
var局部变量类型推断的利弊
java·服务器·前端·javascript·html
threelab2 小时前
Three.js 3D 地图可视化 | 三维可视化 / AI 提示词
前端·javascript·人工智能·3d·着色器
失眠的咕噜2 小时前
PDA 安卓设备上传多张图片
android·前端·javascript
掰头战士3 小时前
深入了解JS原型及原型继承链机制
javascript
一只叁木Meow3 小时前
电商 SKU 选择器:用算法实现优雅的用户交互
前端·javascript·算法
代码煮茶3 小时前
Vue3 Mock 数据实战 | 用 Mockjs + vite-plugin-mock 搭建前端独立开发环境
javascript·vue.js