【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'
    })
  }
}
相关推荐
BioRunYiXue36 分钟前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析
每天吃饭的羊1 小时前
WebAssembly
开发语言·javascript·wasm
风吹心凉1 小时前
第2天|拆解ReAct Prompt:Thought、Action、Observation与信息流
javascript·react.js·prompt
今天AI了吗1 小时前
【AI】一文讲清 RAG:从大模型局限到企业级知识库落地流程
前端·javascript·人工智能·python·深度学习·机器学习·easyui
shmily麻瓜小菜鸡1 小时前
JavaScript / TypeScript 易踩坑知识点完全指南 -假值(Falsy Values)完全指南
开发语言·javascript·typescript
工边页字1 小时前
Electron应用的8种防护方式
前端·javascript·electron
小鱼咕噜咕噜1 小时前
Element UI的el-upload文件上传与ZIP文件解压上传
javascript
陈拉斯1 小时前
上线一个多人扫码网页娱乐工具,我在并发、SEO、PWA 和打包脚本上踩的 8 个坑
javascript
用户298698530142 小时前
在 React 中实现 RTF 与 PDF、HTML 的文档转换实践
javascript·react.js·html