【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'
    })
  }
}
相关推荐
少年姜太公3 小时前
什么?还不知道git cherry pick?
前端·javascript·git
Liu.7745 小时前
vue3使用vue3-print-nb打印
前端·javascript·vue.js
dly_blog6 小时前
Vue 逻辑复用的多种方案对比!
前端·javascript·vue.js
wyzqhhhh7 小时前
京东啊啊啊啊啊
开发语言·前端·javascript
想学后端的前端工程师7 小时前
【Java集合框架深度解析:从入门到精通-后端技术栈】
前端·javascript·vue.js
GISer_Jing8 小时前
Nano Banana:AI图像生成与编辑新标杆
前端·javascript·人工智能
csdn_aspnet8 小时前
用100行實現HTML5可存檔塗鴉版
javascript
布茹 ei ai8 小时前
城市天气查询系统 (City Weather Dashboard)
javascript·vue.js·html·css3·开源软件·天气预报
梵尔纳多10 小时前
Electron 主进程和渲染进程通信
javascript·arcgis·electron
巴拉巴拉~~10 小时前
Flutter 通用滑块组件 CommonSliderWidget:单值 / 范围 + 刻度 + 标签 + 样式自定义
开发语言·前端·javascript