uni-app 【已解决】uni.chooseImage在app端第一次使用时出现的重复触发授权申请的bug

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app 【已解决】uni.chooseImage在app端第一次使用时出现的重复触发授权申请的bug

开发环境 版本号 项目创建方式
Windows 11 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:3.96

手机系统:Android

手机系统版本号:Android 12

手机厂商:vivo

手机机型:Neo3

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX


示例代码:

//从本地或相机获取图片 huoqutupian(index){ const _this = this const sourceType = index === 0 ? [‘camera’] : [‘album’] uni.chooseImage({ count: 1, //默认9 sizeType: [‘original’, ‘compressed’], //可以指定是原图还是压缩图,默认二者都有 sourceType: sourceType, success: function(res) { // TODO 真是上传照片 _this.setData({ imageSrc: res.tempFilePaths[0], }) _this.loadImage();//图片加载 } }); },

//确认是否已获取存储授权 cunchuShouquan(index){ var _this = this plus.android.requestPermissions([‘android.permission.READ_EXTERNAL_STORAGE’], (e) => { if (e.granted.length > 0) {//如果权限被允许 _this.huoqutupian(index) } }) },


8 回复

我也发现这个问题了,选择视频就没问题


用这个 android.permission.WRITE_EXTERNAL_STORAGE权限就可以了。uni.chooseImage是读写权限,你那个是读权限,没有写入权限所以会二次授权

回复 违规昵称4396: 感谢!虽然你给的方案不对,但确实让我搞明白了。我之前只获取了读的权限,而你的方案只获取了写的权限,我测了一下,两个权限都调用的情况下,uni.chooselmage就没有再弹权限获取了,本来这样还是要弹两次的,但是后面突然发现plus.android.requestPermissions是可以同时调用多个权限请求的,所以最终有了这个写法: plus.android.requestPermissions([‘android.permission.READ_EXTERNAL_STORAGE’,‘android.permission.WRITE_EXTERNAL_STORAGE’] 改了之后拿自己手机和同事手机测了一下,都没有问题

哥们你解决了吗?

不行,前两天hbuilder刚更新3.98版本,但是打包后测试还是会弹两次

回复 1***@qq.com: 用这个 android.permission.WRITE_EXTERNAL_STORAGE权限就可以了。uni.chooseImage是读写权限,你那个是读权限,没有写入权限所以会二次授权

我上面写法的存储授权那一步改一下就行,多加一个楼上说的’android.permission.WRITE_EXTERNAL_STORAGE’ plus.android.requestPermissions([‘android.permission.READ_EXTERNAL_STORAGE’,‘android.permission.WRITE_EXTERNAL_STORAGE’]

uni-app 中使用 uni.chooseImage 方法时,如果首次在 App 端调用,可能会出现重复触发授权申请的问题。这个问题通常是由于 App 端权限请求的逻辑处理不当导致的。以下是解决这个问题的步骤:

1. 检查权限配置

首先,确保在 manifest.json 文件中已经正确配置了所需的权限。例如,如果你需要访问相册,应该在 app-plus 节点下添加以下权限配置:

{
  "app-plus": {
    "permissions": {
      "android": {
        "CAMERA": {
          "description": "访问相机"
        },
        "READ_EXTERNAL_STORAGE": {
          "description": "读取外部存储"
        },
        "WRITE_EXTERNAL_STORAGE": {
          "description": "写入外部存储"
        }
      },
      "ios": {
        "NSPhotoLibraryUsageDescription": {
          "description": "访问相册"
        },
        "NSCameraUsageDescription": {
          "description": "使用相机"
        }
      }
    }
  }
}

2. 使用 uni.authorize 提前申请权限

在调用 uni.chooseImage 之前,可以先用 uni.authorize 方法申请相关权限。这样可以避免在 uni.chooseImage 中重复触发权限申请。

uni.authorize({
  scope: 'scope.writePhotosAlbum',
  success() {
    // 权限申请成功,调用 uni.chooseImage
    uni.chooseImage({
      count: 1,
      success(res) {
        console.log('选择的图片路径:', res.tempFilePaths[0]);
      },
      fail(err) {
        console.log('选择图片失败:', err);
      }
    });
  },
  fail(err) {
    console.log('权限申请失败:', err);
    // 可以在这里提示用户手动开启权限
  }
});

3. 处理权限拒绝的情况

如果用户拒绝了权限申请,你可以在 fail 回调中提示用户手动开启权限,并引导用户去设置页面开启权限。

uni.authorize({
  scope: 'scope.writePhotosAlbum',
  success() {
    // 权限申请成功,调用 uni.chooseImage
    uni.chooseImage({
      count: 1,
      success(res) {
        console.log('选择的图片路径:', res.tempFilePaths[0]);
      },
      fail(err) {
        console.log('选择图片失败:', err);
      }
    });
  },
  fail(err) {
    console.log('权限申请失败:', err);
    uni.showModal({
      title: '提示',
      content: '您拒绝了访问相册的权限,是否去设置页面开启?',
      success(res) {
        if (res.confirm) {
          uni.openSetting({
            success(settingRes) {
              console.log('设置页面已打开');
            }
          });
        }
      }
    });
  }
});

4. 检查 uni.chooseImage 的调用时机

确保 uni.chooseImage 的调用时机合理,避免在页面加载时或其他可能触发多次调用的情况下使用。

5. 更新 uni-app 版本

如果你使用的是较老版本的 uni-app,建议升级到最新版本,因为新版本可能已经修复了相关 bug。

6. 使用 uni.getSetting 检查权限状态

在调用 uni.authorize 之前,可以使用 uni.getSetting 检查当前权限状态,避免重复申请权限。

uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.writePhotosAlbum']) {
      uni.authorize({
        scope: 'scope.writePhotosAlbum',
        success() {
          uni.chooseImage({
            count: 1,
            success(res) {
              console.log('选择的图片路径:', res.tempFilePaths[0]);
            },
            fail(err) {
              console.log('选择图片失败:', err);
            }
          });
        },
        fail(err) {
          console.log('权限申请失败:', err);
          uni.showModal({
            title: '提示',
            content: '您拒绝了访问相册的权限,是否去设置页面开启?',
            success(res) {
              if (res.confirm) {
                uni.openSetting({
                  success(settingRes) {
                    console.log('设置页面已打开');
                  }
                });
              }
            }
          });
        }
      });
    } else {
      uni.chooseImage({
        count: 1,
        success(res) {
          console.log('选择的图片路径:', res.tempFilePaths[0]);
        },
        fail(err) {
          console.log('选择图片失败:', err);
        }
      });
    }
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!