xiaoliao998
xiaoliao998
  • 发布:2021-01-04 11:37
  • 更新:2021-05-23 16:58
  • 阅读:2561

【报Bug】plus.android.requestPermissions(["android.permission.ACCESS_FINE_LOCATION"],function(){}) 无效

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

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

HBuilderX类型: Alpha

HBuilderX版本号: 3.0.4

手机系统: Android

手机系统版本号: Android 11

手机厂商: 华为

手机机型: P40

页面类型: nvue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
    plus.android.requestPermissions(  
            ["android.permission.ACCESS_FINE_LOCATION"], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  
            function(resultObj) {  
                console.log(resultObj)  
                        })

判断定位权限方法,安卓端失效

操作步骤:

原来版本都可以,3.0.2.20201225-alpha 版本就不行了,

预期结果:

和之前版本一样,可以判断

实际结果:

无法判断是否开启了定位

bug描述:

    plus.android.requestPermissions(  
            ["android.permission.ACCESS_FINE_LOCATION"], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  
            function(resultObj) {  
                console.log(resultObj)  
                        })

判断定位权限方法,安卓端失效

2021-01-04 11:37 负责人:DCloud_Android_ST 分享
已邀请:
DCMarvel

DCMarvel

顶!!!
更新的啥啊,修复完了都不测试吗? 最少3个alpha版本,都没测试出来吗?
官方示例都不能运行啊

plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION'], function(e){  
        if(e.deniedAlways.length>0){    //权限被永久拒绝  
            // 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启  
            console.log('Always Denied!!! '+e.deniedAlways.toString());  
        }  
        if(e.deniedPresent.length>0){   //权限被临时拒绝  
            // 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限  
            console.log('Present Denied!!! '+e.deniedPresent.toString());  
        }  
        if(e.granted.length>0){ //权限被允许  
            //调用依赖获取定位权限的代码  
            console.log('Granted!!! '+e.granted.toString());  
        }  
    }, function(e){  
        console.log('Request Permissions error:'+JSON.stringify(e));  
    });
DCMarvel

DCMarvel

还没确认BUG吗?Android 动态申请权限都没回调了!

DCloud_heavensoft
  • DCMarvel

    plus.android.requestPermissions 部分权限无弹窗响应,不知道是不是基座问题,有待测试

    2021-01-05 10:07

  • DCMarvel

    permissionExternalStorage once 本地基座不生效了吗?必须云打包才生效吗

    2021-01-05 10:19

DCloud_Android_ST

DCloud_Android_ST

HX基座测试没发现问题。可能与项目调用逻辑有关。有确认了一个类似的bug。通过你的描述看似与我们确认的一个bug有相同之处但不确定。你可以重新云打包测试是否正常

  • xiaoliao998 (作者)

    明天云打包测试下,之前都是可以的,

    2021-01-06 00:37

  • xiaoliao998 (作者)

    云打包后,原问题,解决,但是又引出了另一个问题,就是如果用户永久拒绝定位权限,按照之前的方法

    // Android权限查询

    function requestAndroidPermission(permissionID, message) {

    console.log('权限判断')

    return new Promise((resolve, reject) => {

    plus.android.requestPermissions(

    [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装

    function(resultObj) {

    var result = 0;

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

    var grantedPermission = resultObj.granted[i];

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

    result = 1

    }

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

    var deniedPresentPermission = resultObj.deniedPresent[i];

    // console.log('拒绝本次申请的权限:' + deniedPresentPermission);

    result = 0

    }

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

    var deniedAlwaysPermission = resultObj.deniedAlways[i];

    // console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);

    result = -1

    }

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

    if (result == -1) {

    uni.showToast({

    title: message,

    position: 'bottom',

    duration: 3000,

    success: () => {

    gotoAppPermissionSetting()

    }

    });

    } else {

    resolve(result);

    }

    },

    function(error) {

    console.log('申请权限错误:' + error.code + " = " + error.message);

    resolve({

    code: error.code,

    message: error.message

    });

    }

    );

    });

    }

    出现的结果,是无限的去请求权限,无限卡死,整个手机都完蛋了

    2021-01-08 00:58

  • xiaoliao998 (作者)

    以前从来没有这种问题,不知道怎么搞的, 如果上述判断权限的方法,写在onShow() 里,权限一旦被永久拒绝后,按照上述代码,系统会通过调用gotoAppPermissionSetting(),引导用户去设置权限,但是会陷入死循环,整个手机都会反复的调用判断权限方法,又反复调用gotoAppPermissionSetting() 里面的方法,而如果权限判断方法写在onloading里,就没事,只会走一次,但如果业务场景,必须要求用户给予权限这种特定场景,就会陷入死循环

    2021-01-08 01:09

  • DCloud_Android_ST

    回复 xiaoliao998: 一直都不可以在onShow里触发权限申请 因为权限申请会触发onShow

    2021-01-08 10:57

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 以前可以,以前完全没问题,我代码完全都没动过,那这种极端场景就无法处理了吗??

    2021-01-08 14:22

  • DCloud_Android_ST

    回复 xiaoliao998: 。。。我了解到的是一直不可以。别再onShow触发权限申请

    2021-01-08 15:06

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 业务需要啊 老大,

    2021-01-08 15:38

  • DCloud_Android_ST

    回复 xiaoliao998: 你说的之前可以是什么版本。我也说了 我了解就是不能再onshow权限申请 会死循环的。你什么业务也不能这样玩

    2021-01-08 18:41

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 我都不清楚什么版本了,感觉好像,2.9.8 版本,因为我最早测试过,所以很肯定,之前是没有问题的。业务的话,进入某页面,就判断权限是否开启,如果没有开启,引导开启啊。而不是onload一次性,因为这个页面是底部选项卡页面,只会触发一次onload , 很尴尬

    2021-01-08 19:46

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 大哥,之前有一个更新的版本,支持了onShow 进行权限申请,更新到最新的3.1.8.20210407-alpha,又出现了无限死循环

    2021-04-10 14:40

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 大佬帮忙看一下啊,最新3.1.8.20210407-alpha,又开始这个死样了,难受

    2021-04-12 10:55

  • DCloud_Android_ST

    回复 xiaoliao998: plus.android.requestPermissions一直都不可以在onshow申请权限 不用质疑

    2021-04-12 12:20

  • xiaoliao998 (作者)

    回复 DCloud_Android_ST: 我明明记得,之前好好的,现在更新了又不行了,你们之前有个版本--- App-Android平台 修复 页面生命周期 onshow 中调用 getLocation 可能会引起死循环的Bug,是不是这个bug又在这个版本中复现了,反正和我的这个比较像

    2021-04-12 12:35

  • DCloud_Android_ST

    回复 xiaoliao998: 修复的是模块内部申请权限 与plus.android.requestPermissions无关 这逻辑也好处理 你加个次数限制 查过3次就不申请了就行了

    2021-04-12 12:39

芜湖

芜湖 - 95后的页面仔

我也遇到了同样的问题,请问楼主解决了吗?

xiaoliao998

xiaoliao998 (作者) - null

建议排查下这个方法,

// 跳转到**应用**的权限页面  
function gotoAppPermissionSetting() {  
    if (isIos) {  
        var UIApplication = plus.ios.import("UIApplication");  
        var application2 = UIApplication.sharedApplication();  
        var NSURL2 = plus.ios.import("NSURL");  
        // var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");       
        var setting2 = NSURL2.URLWithString("app-settings:");  
        application2.openURL(setting2);  

        plus.ios.deleteObject(setting2);  
        plus.ios.deleteObject(NSURL2);  
        plus.ios.deleteObject(application2);  
    } else {  
        // console.log(plus.device.vendor);  
        var Intent = plus.android.importClass("android.content.Intent");  
        var Settings = plus.android.importClass("android.provider.Settings");  
        var Uri = plus.android.importClass("android.net.Uri");  
        var mainActivity = plus.android.runtimeMainActivity();  
        var intent = new Intent();  
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
        var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);  
        intent.setData(uri);  
        mainActivity.startActivity(intent);  
    }  
}

当权限被拒绝后,引导去开启,会无限死循环

该问题目前已经被锁定, 无法添加新回复