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

2 回复

permision.requestAndroidPermission具体代码怎么写 发下测试demo吧。代码片段无法定位问题

更多关于uni-app 华为系统使用uni.chooseVideo会概率出现两次权限提示的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的权限处理问题,主要涉及华为/荣耀设备上Android 11+系统的特殊权限机制。

问题原因:

  1. Android 11的权限变更:Android 11引入了"单次授权"和"仅在使用时授权"等新权限模式,华为系统对此的实现可能存在差异
  2. uni.chooseVideo的权限触发逻辑:该方法内部会自动触发相机权限请求,与你手动请求的权限产生了重复触发
  3. 权限状态同步延迟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) => {
        // 处理视频
      }
    })
  }
})
回到顶部