uni-app plus.android.requestPermissions一直返回-1 一直重复申请

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app plus.android.requestPermissions一直返回-1 一直重复申请

开发环境 版本号 项目创建方式
HBuilderX 3.8.12 云端

操作步骤:

<script>  
export default {  
  data() {  
    return {  
    };  
  },  
 onShow() {  
  plus.android.requestPermissions(  
                    ['android.permission.ACCESS_FINE_LOCATION'],   
                    function(resultObj) {  
                        console.log(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, a);  
                            result = -1  
                        }  
                    },  
                    function(error) {  
                        console.log('申请权限错误:' + error.code + " = " + error.message);  
                    }  
                );  
 }  
};  
</script>

或是将其写成方法放在methods中,依旧会反复申请

预期结果:

plus.android.requestPermissions在放置于onshow周期中,当返回为-1时应该只申请一次

实际结果:

plus.android.requestPermissions在放置于onshow周期中,当返回为-1时会反复申请权限

bug描述:

plus.android.requestPermissions在放置于onshow周期中,当返回为-1时会反复申请权限,其他10正常  
复现代码:  
见复现代码  

plus.android.requestPermissions在放置于单击事件中,则只会申请一次  
示例代码:
```javascript
<template>  
  <view>  
   <view>  
    <button @tap="test">测试</button>  
    </view>  
  </view>  
</template>  
export default {  
  data() {  
    return {  
    };  
  },  
 methods: {  
    test() {  
          plus.android.requestPermissions(  
                    ['android.permission.ACCESS_FINE_LOCATION'],   
                    function(resultObj) {  
                        console.log(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, a);  
                            result = -1  
                        }  
                    },  
                    function(error) {  
                        console.log('申请权限错误:' + error.code + " = " + error.message);  
                    }  
                );  
    }  
 }  
};  
</script>

2 回复

请问解决了吗


在 UniApp 中使用 plus.android.requestPermissions 时,如果一直返回 -1 并且重复申请权限,可能是由于以下几个原因导致的。你可以根据这些原因进行排查和解决:

1. 权限未在 manifest.json 中声明

在 Android 应用中,所有需要申请的权限都必须在 manifest.json 文件中声明。如果未声明,requestPermissions 可能会一直返回 -1

解决方法:manifest.json 文件中添加所需的权限。例如:

{
  "permissions": {
    "android": [
      "android.permission.CAMERA",
      "android.permission.READ_EXTERNAL_STORAGE",
      "android.permission.WRITE_EXTERNAL_STORAGE"
    ]
  }
}

2. 权限已经被拒绝

如果用户之前拒绝了权限请求,并且选择了“不再询问”,那么 requestPermissions 会直接返回 -1,而不会弹出权限请求对话框。

解决方法: 你可以通过 plus.android.checkPermission 检查权限是否被永久拒绝。如果是,可以提示用户手动去设置中开启权限。

plus.android.checkPermission(permission, function(status) {
    if (status === -1) {
        // 权限被永久拒绝,提示用户去设置中开启
        plus.nativeUI.alert("请手动开启权限");
    }
});

3. 权限请求代码逻辑问题

如果权限请求的代码逻辑有问题,可能会导致重复申请权限。

解决方法: 确保在请求权限时,逻辑正确。例如:

plus.android.requestPermissions([permission], function(result) {
    if (result === 0) {
        // 权限已授予
        console.log("权限已授予");
    } else {
        // 权限被拒绝
        console.log("权限被拒绝");
    }
}, function(error) {
    console.log("请求权限失败: " + error);
});

4. Android 版本兼容性问题

在某些 Android 版本上,权限请求的行为可能会有所不同。例如,Android 6.0(API 23)及以上版本需要动态申请权限。

解决方法: 确保你的应用在 Android 6.0 及以上版本上正确处理权限请求。

5. UniApp 版本问题

如果你使用的是较旧的 UniApp 版本,可能存在一些已知的权限请求问题。

解决方法: 尝试升级到最新的 UniApp 版本,以确保问题已经修复。

6. 设备或系统问题

某些设备或系统可能存在兼容性问题,导致权限请求无法正常工作。

解决方法: 尝试在其他设备或模拟器上运行应用,看看问题是否依然存在。

7. 调试和日志

如果以上方法都无法解决问题,可以通过调试和日志来进一步排查问题。

解决方法:requestPermissions 的回调中添加日志,查看具体的错误信息。

plus.android.requestPermissions([permission], function(result) {
    console.log("权限请求结果: " + result);
    if (result === 0) {
        console.log("权限已授予");
    } else {
        console.log("权限被拒绝");
    }
}, function(error) {
    console.log("请求权限失败: " + error);
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!