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