使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调
- 发布:2024-02-21 16:48
- 更新:2024-06-04 11:12
- 阅读:621
【报Bug】申请某个权限并拒绝,查询该权限,无授权弹窗弹出但会立即触发uni.createRequestPermissionListener的onConfirm、onComplete回调
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: Windows11
HBuilderX类型: Alpha
HBuilderX版本号: 4.01
手机系统: Android
手机系统版本号: Android 12
手机厂商: 华为
手机机型: HUAWEI MatePad
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
未有授权弹窗弹出时,不应该触发权限申请监听的onConfirm、onComplete回调
未有授权弹窗弹出时,不应该触发权限申请监听的onConfirm、onComplete回调
实际结果:
未有授权弹窗弹出,触发了权限申请监听的onConfirm、onComplete回调
未有授权弹窗弹出,触发了权限申请监听的onConfirm、onComplete回调
bug描述:
使用uni.createRequestPermissionListener监听申请权限,申请某个权限并拒绝,再使用plus.android.requestPermissions查询该权限,无授权弹窗弹出并且会立即触发权限申请监听的onConfirm、onComplete回调
喜欢技术的前端 - QQ---445849201
授权这里,授权弹框一共会弹出两次(除非清除app数据),第一次拒绝之后,不管是再次获取权限还是查询该权限都会再弹出一次,再次永久拒绝,就不会再弹了,设计是这样的
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;
}
});
9***@qq.com (作者)
我目前没出现过拒绝授权之后,还能唤起授权弹窗的情况
2024-02-22 09:52
periH
uni.makePhoneCall拒绝权限后确实会触发一次onConfirm,但是没有权限弹窗
2024-02-29 11:31