9***@qq.com
9***@qq.com
  • 发布:2024-02-21 16:48
  • 更新:2024-06-04 11:12
  • 阅读:621

【报Bug】申请某个权限并拒绝,查询该权限,无授权弹窗弹出但会立即触发uni.createRequestPermissionListener的onConfirm、onComplete回调

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: Windows11

HBuilderX类型: Alpha

HBuilderX版本号: 4.01

手机系统: Android

手机系统版本号: Android 12

手机厂商: 华为

手机机型: HUAWEI MatePad

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调

预期结果:

未有授权弹窗弹出时,不应该触发权限申请监听的onConfirm、onComplete回调

实际结果:

未有授权弹窗弹出,触发了权限申请监听的onConfirm、onComplete回调

bug描述:

使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调

2024-02-21 16:48 负责人:无 分享
已邀请:
喜欢技术的前端

喜欢技术的前端 - QQ---445849201

授权这里,授权弹框一共会弹出两次(除非清除app数据),第一次拒绝之后,不管是再次获取权限还是查询该权限都会再弹出一次,再次永久拒绝,就不会再弹了,设计是这样的

  • 9***@qq.com (作者)

    我目前没出现过拒绝授权之后,还能唤起授权弹窗的情况

    2024-02-22 09:52

  • periH

    uni.makePhoneCall拒绝权限后确实会触发一次onConfirm,但是没有权限弹窗

    2024-02-29 11:31

3***@qq.com

3***@qq.com

this.listener && this.listener.stop();
this.listener = uni.createRequestPermissionListener();
this.permissions = [];
this.isShowPermissionTips = false;
this.listener.onRequest((names) => {
//即将开始请求权限前的回调,无论权限是否被拒绝过,names是权限数组,如: ["android.permission.CAMERA"]
for (let name of names) {
let index = this.permissions.findIndex((permission) => permission.name === name);
if (index === -1) this.permissions.push({ name, completed: false });
console.log("onRequest", name);
}
});
this.listener.onConfirm((names) => {
//即将弹出系统授权弹窗前的回调,如果之前就已经被拒绝的权限,不会进入这个回调。
//假如onRequest中names是4个,其中2个被永久拒绝,那么onConfirm这里的names就是另外2个。
//也就是说,如果进入了这个回调,它肯定就是将要弹窗,然后names就是需要弹窗授权的权限。
for (let name of names) {
console.log("onConfirm", name);
}
this.isShowPermissionTips = true;
});
this.listener.onComplete((names) => {
//如果前面有授权弹窗弹出,到这里时就是已经关闭了。
//在onRequest中出现的权限,也都会在onComplete这里出现,不过onComplete有可能会多次被调用。
for (let name of names) {
let permission = this.permissions.find((permission) => permission.name === name);
if (permission) permission.completed = true;
console.log("onComplete", name);
}
//这里进行判断一下是否全部权限都completed了。
let completedAll = this.permissions.filter((permission) => permission.completed).length === this.permissions.length;
if (completedAll) {
this.listener.stop();
this.permissions = [];
this.isShowPermissionTips = false;
}
});

要回复问题请先登录注册