【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'
    })
  }
}
相关推荐
麦当_6 分钟前
ReAct 模式在 Neovate 中的应用
前端·javascript·架构
itslife10 分钟前
vite源码 - 开始
前端·javascript
Achieve - 前端实验室10 分钟前
【每日一面】React Hooks闭包陷阱
前端·javascript·react.js
Asort12 分钟前
JavaScript设计模式(四)——建造者模式:优雅构建复杂对象的实用指南
前端·javascript·设计模式
猪哥帅过吴彦祖2 小时前
第 5 篇:WebGL 从 2D 到 3D - 坐标系、透视与相机
前端·javascript·webgl
折七2 小时前
expo sdk53+ 集成极光推送消息推送 ios swift
前端·javascript·ios
白水清风2 小时前
【基础】关于函数式编程的知识
前端·javascript·面试
蓝莓味的口香糖2 小时前
【JS】JS基础-对象处理方法整合
开发语言·前端·javascript
一只小风华~3 小时前
学习笔记:Vue Router 中的嵌套路由详解[特殊字符]概述
前端·javascript·vue.js
一只小风华~3 小时前
Vue Router 命名路由学习笔记
前端·javascript·vue.js·笔记·学习·ecmascript