uni-app plus.android.requestPermissions一直返回-1 一直重复申请
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时会反复申请权限,其他1或0正常
复现代码:
见复现代码
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>
请问解决了吗
在 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);
});