uni-app uni.scanCode 拒绝后重新进入又被拉起权限询问(不应该拉起),再拒绝一次后重新进入就不会被拉起了

uni-app uni.scanCode 拒绝后重新进入又被拉起权限询问(不应该拉起),再拒绝一次后重新进入就不会被拉起了

示例代码:

uni.scanCode({ success: async (res) => {} })


## 操作步骤:

直接扫码

## 预期结果:

第一次拒绝后,再次进入就不要弹出 权限询问

## 实际结果:

连续拒绝两次才不会弹出

## bug描述:

问题:uni.scanCode 拒绝后重新进入 又被拉起了权限询问(不应该拉起),再拒绝一次后重新进入就不会被拉起  
期望目标:只拒绝一次,不要重复2次
信息类型 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 w10
HBuilderX类型 正式
HBuilderX版本号 4.08
手机系统 Android
手机系统版本号 Android 10
手机厂商 小米
手机机型 Redmi 7
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app uni.scanCode 拒绝后重新进入又被拉起权限询问(不应该拉起),再拒绝一次后重新进入就不会被拉起了的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

应该不是问题吧,我看了几个项目都这样,可以取消问题了

更多关于uni-app uni.scanCode 拒绝后重新进入又被拉起权限询问(不应该拉起),再拒绝一次后重新进入就不会被拉起了的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中使用 uni.scanCode 进行扫码时,如果用户拒绝了权限请求,再次进入页面时系统可能会再次弹出权限请求对话框。这种行为通常是由于系统的权限管理机制导致的。为了优化用户体验,可以采取以下措施来避免重复弹出权限请求对话框。

1. 检查权限状态

在调用 uni.scanCode 之前,可以先检查用户是否已经授予了相关权限。如果用户已经拒绝了权限,可以提示用户手动开启权限,而不是直接调用 uni.scanCode 导致再次弹出权限请求对话框。

uni.getSetting({
  success(res) {
    if (!res.authSetting['scope.camera']) {
      // 用户未授权相机权限
      uni.showModal({
        title: '提示',
        content: '请开启相机权限以使用扫码功能',
        success(res) {
          if (res.confirm) {
            // 用户点击确定,跳转到设置页面
            uni.openSetting({
              success(res) {
                console.log(res.authSetting);
              }
            });
          }
        }
      });
    } else {
      // 用户已授权,直接调用扫码功能
      uni.scanCode({
        success(res) {
          console.log(res.result);
        },
        fail(err) {
          console.error(err);
        }
      });
    }
  }
});

2. 记录用户的选择

可以记录用户是否已经拒绝了权限请求。如果用户已经拒绝了权限请求,再次进入页面时不再直接调用 uni.scanCode,而是提示用户手动开启权限。

let hasDeniedPermission = false; // 假设这是一个全局变量或存储在本地

if (hasDeniedPermission) {
  uni.showModal({
    title: '提示',
    content: '请开启相机权限以使用扫码功能',
    success(res) {
      if (res.confirm) {
        uni.openSetting({
          success(res) {
            console.log(res.authSetting);
          }
        });
      }
    }
  });
} else {
  uni.scanCode({
    success(res) {
      console.log(res.result);
    },
    fail(err) {
      if (err.errMsg.includes('auth deny')) {
        hasDeniedPermission = true; // 记录用户拒绝了权限
      }
      console.error(err);
    }
  });
}

3. 使用 uni.authorize

在调用 uni.scanCode 之前,可以先调用 uni.authorize 请求权限。如果用户拒绝了权限,可以提示用户手动开启权限。

uni.authorize({
  scope: 'scope.camera',
  success() {
    // 用户已授权,直接调用扫码功能
    uni.scanCode({
      success(res) {
        console.log(res.result);
      },
      fail(err) {
        console.error(err);
      }
    });
  },
  fail(err) {
    if (err.errMsg.includes('auth deny')) {
      uni.showModal({
        title: '提示',
        content: '请开启相机权限以使用扫码功能',
        success(res) {
          if (res.confirm) {
            uni.openSetting({
              success(res) {
                console.log(res.authSetting);
              }
            });
          }
        }
      });
    }
  }
});
回到顶部