uni-app开发Android App时,使用Uni.chooseImage()选择本地图片提示授权拒绝,引导用户打开照片和视频权限后,返回页面仍提示引导语,无法进入选择相册页面

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

uni-app开发Android App时,使用Uni.chooseImage()选择本地图片提示授权拒绝,引导用户打开照片和视频权限后,返回页面仍提示引导语,无法进入选择相册页面

示例代码:

// 选择本地上传代码  
let reposi = permision.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE');  
let reWriting = permision.requestAndroidPermission('android.permission.WRITE_EXTERNAL_STORAGE');  
Promise.all([reposi, reWriting]).then((values1) => {  
    console.log('读取相册读取相册', Array.isArray(values1), values1);  
    if (Array.isArray(values1)) {  
        var soneOme1 = values1.every(el => el == 1);  
        if (soneOme1) {  
            this.actionsshow = false;  
            this.chooseImages('album');  
        } else {  
            this.selectTip('读取相册');  
        }  
    }  
});  

// 提示的方法  
selectTip(strtip) {  
    uni.showModal({  
        title: '提示',  
        content: `请在手机设置中为该应用打开${strtip}权限`,  
        showCancel: false,  
        success(res) {  
            if (res.confirm) {  
                permision.gotoAppPermissionSetting();  
            }  
        }  
    })  
}

操作步骤:

复现就是真机测试时 选择照片和视频是可以打开图片选择页面,但是离线打包完之后进入不了,还是会提示我们引导用户的提示语

离线包中AndroidManifest.xml中已经添加了读取存储权限了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

预期结果:

预期结果是:使用Android Studio打包完之后 即使选择本地图片授权提示都选择了拒绝,但是我们引导后再次打开照片和视频权限时,也应该能打开照片和视频权限

离线包中AndroidManifest.xml中已经添加了读取存储权限了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

实际结果:

目前的结果是,apk安装在手机上时,选择本地图片授权提示都拒绝后,引导用户打开照片和视频权限时,进入不了相册页面,还是会提示我们引导用户的提示语

bug描述:

使用hbuilderx4.06编译器开发使用uniapp框架,开发Android App 其中App中使用到了上传本地图片功能,问题是连接真机测试时,选择本地上传会提示让你授权提示,我们都选择拒绝,最后引导我们去打开相册权限,此时小米手机是照片和视频权限,我们打开照片和视频权限时直接连续打开音频和文件权限,都打开权限后再次点击本地上传时可以进入选择相册页面; 但是使用Android Studio进行离线打包安装到手机上时点击本地上传,授权提示都选择拒绝,最后引导我们打开相册权限,小米手机是打开照片和视频权限,此时我们打开照片和视频权限时,不会直接连续打开音频和文件权限,就只是打开了照片和视频权限,返回到页面中再次选择本地上传时,还是会提示我们引导用户的提示语,进入不了图片选择页面,是什么原因呢

离线包中AndroidManifest.xml中已经添加了读取存储权限了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
信息 描述
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 win11
HBuilderX类型 正式
HBuilderX版本 4.06
手机系统 Android
手机系统版本 Android 13
手机厂商 小米
手机机型 redmiK50
页面类型 vue
vue版本 vue2
打包方式 离线
项目创建方式 HBuilderX

1 回复

在 uni-app 开发 Android App 时,使用 Uni.chooseImage() 选择本地图片时,如果遇到授权拒绝问题,并且即使引导用户打开照片和视频权限后,返回页面仍提示引导语,无法进入选择相册页面,可能是以下原因导致的:


1. 权限未正确获取

  • 虽然用户打开了权限,但应用可能未检测到权限状态的变化。
  • 解决方法:在用户返回页面后,重新检查权限状态,并根据结果决定是否继续调用 Uni.chooseImage()
uni.getSetting({
  success(res) {
    if (res.authSetting['scope.writePhotosAlbum']) {
      // 权限已开启,继续调用 chooseImage
      uni.chooseImage({
        count: 1,
        success(res) {
          console.log('选择图片成功', res.tempFilePaths);
        },
        fail(err) {
          console.log('选择图片失败', err);
        }
      });
    } else {
      // 权限未开启,提示用户手动开启
      uni.showModal({
        title: '提示',
        content: '需要开启照片和视频权限才能选择图片,是否去设置?',
        success(res) {
          if (res.confirm) {
            uni.openSetting();
          }
        }
      });
    }
  }
});

2. 权限配置问题

  • 确保在 manifest.json 中正确配置了 Android 权限。
  • 示例:
    {
      "app-plus": {
        "distribute": {
          "android": {
            "permissions": [
              "android.permission.READ_EXTERNAL_STORAGE",
              "android.permission.WRITE_EXTERNAL_STORAGE"
            ]
          }
        }
      }
    }

3. 用户未真正开启权限

  • 用户可能只是点击了“取消”或未真正开启权限。
  • 解决方法:在 uni.openSetting() 的回调中再次检查权限状态,确保用户已开启权限。
uni.openSetting({
  success(res) {
    if (res.authSetting['scope.writePhotosAlbum']) {
      // 权限已开启,继续操作
      uni.chooseImage({
        count: 1,
        success(res) {
          console.log('选择图片成功', res.tempFilePaths);
        }
      });
    } else {
      // 权限未开启,提示用户
      uni.showToast({
        title: '权限未开启,无法选择图片',
        icon: 'none'
      });
    }
  }
});

4. 页面未正确刷新

  • 用户返回页面后,页面可能未刷新,导致权限状态未更新。
  • 解决方法:在 onShow 生命周期中重新检查权限状态。
export default {
  onShow() {
    uni.getSetting({
      success(res) {
        if (res.authSetting['scope.writePhotosAlbum']) {
          // 权限已开启,继续操作
        }
      }
    });
  }
};

5. HBuilderX 版本问题

  • 如果使用的是较旧的 HBuilderX 版本,可能存在兼容性问题。
  • 解决方法:升级到最新版本的 HBuilderX,并重新编译项目。

6. Android 系统问题

  • 某些 Android 系统(如 MIUI、EMUI 等)对权限管理较为严格,可能导致权限无法正常获取。
  • 解决方法:提示用户手动在系统设置中开启权限。

7. 调试与日志

  • 在控制台打印日志,检查权限状态和错误信息,定位问题。
uni.getSetting({
  success(res) {
    console.log('权限状态', res.authSetting);
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!