uni-app 华为系统使用uni.chooseVideo会概率出现两次权限提示
uni-app 华为系统使用uni.chooseVideo会概率出现两次权限提示
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 21H1 | HBuilderX |
| 3.2.16 |
产品分类:uniapp/App
PC开发环境操作系统:Windows
手机系统:Android
手机系统版本号:Android 11
手机厂商:华为
手机机型:荣耀9X
页面类型:vue
vue版本:vue2
打包方式:云端
示例代码:
permision.requestAndroidPermission('android.permission.CAMERA').then((res)=>{
if(res==1){
uni.chooseVideo({sourceType:['camera']})
}
}
操作步骤:
permision.requestAndroidPermission('android.permission.CAMERA').then((res)=>{
if(res==1){
uni.chooseVideo({sourceType:['camera']})
}
}
预期结果:
禁止权限后res为-1,并且单uni.chooseVideo只出现一次禁止授权弹窗
实际结果:
禁止权限后res为0,并且单uni.chooseVideo会出现两次内容相同的禁止权限提示
bug描述:
华为系统使用uni.chooseVideo会概率出现两次权限提示,并且使用permision.requestAndroidPermission(‘android.permission.CAMERA’)判断权限禁止后一直提示为0导致权限判断反复出现
更多关于uni-app 华为系统使用uni.chooseVideo会概率出现两次权限提示的实战教程也可以访问 https://www.itying.com/category-93-b0.html
permision.requestAndroidPermission具体代码怎么写 发下测试demo吧。代码片段无法定位问题
更多关于uni-app 华为系统使用uni.chooseVideo会概率出现两次权限提示的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个已知的权限处理问题,主要涉及华为/荣耀设备上Android 11+系统的特殊权限机制。
问题原因:
- Android 11的权限变更:Android 11引入了"单次授权"和"仅在使用时授权"等新权限模式,华为系统对此的实现可能存在差异
- uni.chooseVideo的权限触发逻辑:该方法内部会自动触发相机权限请求,与你手动请求的权限产生了重复触发
- 权限状态同步延迟:
permision.requestAndroidPermission返回的状态可能与系统实际状态不同步
解决方案:
方案一:优化权限检查逻辑
// 使用uni.getSystemInfo判断是否为华为设备
uni.getSystemInfo({
success: function(res) {
const isHuawei = res.brand.toLowerCase().includes('huawei') ||
res.manufacturer.toLowerCase().includes('huawei')
if(isHuawei) {
// 华为设备使用更严格的权限检查
checkAndRequestPermission()
} else {
// 其他设备使用原有逻辑
originalPermissionLogic()
}
}
})
async function checkAndRequestPermission() {
try {
// 先尝试直接调用,捕获权限异常
uni.chooseVideo({
sourceType: ['camera'],
success: (res) => {
// 成功处理
},
fail: (err) => {
// 权限被拒绝后的处理
if(err.errMsg.includes('permission')) {
uni.showModal({
title: '提示',
content: '需要相机权限才能拍摄视频',
success: (modalRes) => {
if(modalRes.confirm) {
// 引导用户去设置页面
uni.openSetting()
}
}
})
}
}
})
} catch(error) {
console.error('权限请求异常:', error)
}
}
方案二:使用条件编译处理华为设备
// #ifdef APP-PLUS
// 针对Android平台的特殊处理
if(plus.os.name.toLowerCase() === 'android') {
// 延迟执行权限请求,避免冲突
setTimeout(() => {
uni.chooseVideo({
sourceType: ['camera'],
success: () => {
// 成功回调
}
})
}, 300)
}
// #endif
方案三:统一权限管理(推荐)
// 创建权限管理工具
const permissionUtil = {
// 检查并请求相机权限
async requestCameraPermission() {
return new Promise((resolve) => {
// 使用uni.authorize尝试授权
uni.authorize({
scope: 'scope.camera',
success: () => {
resolve(true)
},
fail: () => {
resolve(false)
// 授权失败,提示用户
this.showPermissionGuide()
}
})
})
},
// 显示权限引导
showPermissionGuide() {
uni.showModal({
title: '权限提示',
content: '需要相机权限才能使用拍摄功能',
confirmText: '去设置',
success: (res) => {
if(res.confirm) {
uni.openSetting()
}
}
})
}
}
// 使用方式
permissionUtil.requestCameraPermission().then((hasPermission) => {
if(hasPermission) {
uni.chooseVideo({
sourceType: ['camera'],
success: (res) => {
// 处理视频
}
})
}
})

