【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'
    })
  }
}
相关推荐
天平4 小时前
油猴脚本创建webworker踩坑记录
前端·javascript·typescript
山河木马10 小时前
渲染管线-计算得到gl_Position(顶点着色器)之后续GPU流程
javascript·webgl·图形学
竹林81810 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
kyriewen13 小时前
别再每次都 Google 了:我整理了前端日常最常踩的 10 个 Git 坑,附速查表
前端·javascript·git
SmartBoyW14 小时前
深入ECMAScript规范:彻底搞懂JS隐式类型转换与底层ToPrimitive机制
前端·javascript
用户8524950718414 小时前
解密 JavaScript 中的 this:谁才是真正的调用者?
javascript·面试
Heo14 小时前
Vite进阶用法详解
前端·javascript·面试
铁皮饭盒16 小时前
Next.js 风格路由内置?Bun FileSystemRouter 凭啥这么香
javascript
小林ixn17 小时前
别再背八股了!从 5 个真实场景彻底搞懂 JavaScript 的 this
javascript
东风破_17 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript