wwwzzz
wwwzzz
  • 发布:2023-04-03 17:21
  • 更新:2023-12-01 16:28
  • 阅读:781

【报Bug】android uni.chooseImage,拍照获取权限,拒绝后重复弹窗

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

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

HBuilderX类型: 正式

HBuilderX版本号: 3.6.4

手机系统: Android

手机系统版本号: Android 12

手机厂商: 三星、oppo 都有

手机机型: SM-S9010,PMCC,

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

示例代码:

uni.chooseImage({
count: 1, //默认9
sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
sourceType: ["album"], // 从相册选择
success: function (res) {
const src = res.tempFilePaths[0];
emit("confirm", src);
},
fail: function () {
console.log("album err");

    }

操作步骤:

使用以上代码。

预期结果:

选择不允许相关权限后,只弹一次弹窗

实际结果:

弹出两次

bug描述:

调用uni.chooseImage选择打开相机权限,弹出允许访问权限弹窗,选择不允许后,继续弹同一个弹窗,再点击不允许才关闭。

2023-04-03 17:21 负责人:DCloud_UNI_Anne 分享
已邀请:
FullStack

FullStack - 【插件开发】【专治疑难杂症】【ios上架、马甲包、白包、过审、已成功上架过几百个】【多款插件已上架:https://ext.dcloud.net.cn/publisher?id=22130】【非诚勿扰】QQ:543610866

不想弹第二次,可以先判断该权限是否被拒绝,如果拒绝过了,就不执行uni.chooseImage

龙朕

龙朕

第一次弹窗就是在调用了uni.chooseImage()方法之后,中间过程判断不了

  • wwwzzz (作者)

    用上面那位兄弟的方法可以

    2023-04-26 09:21

  • 龙朕

    回复 wwwzzz: 第一次调用之前怎么判断权限?我试了在第一次调用chooseImage之前调用uni.getAppAuthorizeSetting()返回是默认没给权限,也就是连第一次让用户选择的机会都没有。

    {

    "cameraAuthorized": "denied",

    "microphoneAuthorized": "denied",

    "notificationAuthorized": "authorized",

    "locationAccuracy": "unsupported",

    "locationAuthorized": "denied"

    }

    2023-04-26 10:15

  • wwwzzz (作者)

    回复 龙朕: android:function requestAndroidPermission(permissionID: string) {

    return new Promise((resolve) => {

    plus.android.requestPermissions(

    [permissionID], //

    function (resultObj) {

    let result = 0;

    for (let i = 0; i < resultObj.granted.length; i++) {

    const grantedPermission = resultObj.granted[i];

    console.log("已获取的权限:" + grantedPermission);

    result = 1;

    }

    for (let i = 0; i < resultObj.deniedPresent.length; i++) {

    const deniedPresentPermission = resultObj.deniedPresent[i];

    console.log(

    "拒绝本次申请的权限:" + deniedPresentPermission

    );

    result = 0;

    }

    for (let i = 0; i < resultObj.deniedAlways.length; i++) {

    const deniedAlwaysPermission = resultObj.deniedAlways[i];

    console.log(

    "永久拒绝申请的权限:" + deniedAlwaysPermission

    );

    result = -1;

    }

    resolve(result);

    // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限

    // if (result != 1) {

    // gotoAppPermissionSetting()

    // }

    },

    function (error) {

    console.log(

    "申请权限错误:" + error.code + " = " + error.message

    );

    resolve({

    code: error.code,

    message: error.message

    });

    }

    );

    });

    } requestAndroidPermission("android.permission.CAMERA")先用这个判断 如果是打开权限再调用chooseImage

    2023-04-26 10:39

  • 龙朕

    回复 wwwzzz: 我试了,第一次调用plus.android.requestPermissions选择禁止,再次调用也会再弹窗,也就是需要自己保存第一次禁止的状态是吧。而且chooseImage是可以选择拍摄或者从相册选择,如果自己处理的话还需要同时获取相册的权限,而不是在选择了拍摄还是从相册获取图片之后再获取相应的权限,你提供的这个方法就是在chooseImage不改的情况下可以用来满足一下审核要求,还是感谢哈。

    2023-04-26 11:26

龙朕

龙朕

我发现uni.getLocation也有同样的问题,第一次调用弹窗禁止后,第二次调用又会弹窗获取定位权限,但第三次就不弹窗直接返回失败,希望技术能统一处理成第二次就不弹窗直接返回失败

  • wwwzzz (作者)

    我没用到这个功能,不好意思

    2023-04-26 20:12

1***@qq.com

1***@qq.com

请问解决了吗?

要回复问题请先登录注册