uni-app 安卓端位置获取失败问题
uni-app 安卓端位置获取失败问题
uniapp的 安卓app 定位权限被拒绝后,询问是否开启授权并跳转到手机设置页面
设置开启以后返回到app端, 调用uni.getLocation还是进入fail里面了, 必须要重新启动app才可以正常获取
uni.getLocation({
type: 'gcj02',
success: res => {
this.latitude = res.latitude
this.longitude = res.longitude
},
fail: error => {
console.log("获取定位失败了",error)
uni.showModal({
title: '提示',
content: '获取定位失败,是否授权打开定位',
success: (res) => {
if(res.confirm){
uni.getSystemInfo({
success: (sys) => {
if(sys.platform=='ios'){
plus.runtime.openURL("app-settings://");
}else{
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
//可能应该直接进入应用列表的权限设置?=> android.settings.APPLICATION_SETTINGS
var mIntent = new Intent('android.settings.LOCATION_SOURCE_SETTINGS');
main.startActivity(mIntent);
}
}
})
}
}
})
}
});

相关链接 :
更多关于uni-app 安卓端位置获取失败问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
好的,谢谢
同问 希望官方看下问题
是用户拒绝授权后, uni.getSystemInfo打开设置给应用位置权限,然后返回app调取的uni.getlocation还是进入fail里面,提示获取失败
用户拒绝授权后, 通过api 方法打开授权设置页面, 授权后uni.getlocation还是进入fail里面
ios 无此问题 安卓有
回复 yeii: 确实这个快逻辑处理确实有些问题 后续会调整
手机没办法同时截图,使用的模拟器截图,上面是在设置中给了应用位置权限,但是返回app还是获取位置失败,只有关掉app重新启动才可以获取到用户位置信息!
楼主当时在ios端有这个问题吗?
我这边在iOS端遇到了类似的问题,用permision.judgeIosPermission(‘location’)判断app定位权限是开启状态(实际也确实是开启的), 但是getLocation 一直在走fail的回调
同样是重启了app之后就正常了
这个问题是因为Android系统在权限变更后,应用进程需要重新触发权限检查。当用户从系统设置返回应用时,权限状态已更新,但应用运行时尚未同步新的权限状态。
解决方案是在返回应用时重新触发定位请求。可以通过以下两种方式处理:
- 使用页面生命周期钩子:在
onShow生命周期中重新调用uni.getLocation
onShow() {
// 从设置返回时重新获取定位
this.getLocation()
}
- 监听应用前后台切换:使用
uni.onAppShow监听应用回到前台
uni.onAppShow(() => {
this.getLocation()
})
修改后的代码示例:
methods: {
getLocation() {
uni.getLocation({
type: 'gcj02',
success: res => {
this.latitude = res.latitude
this.longitude = res.longitude
},
fail: error => {
console.log("获取定位失败", error)
this.showPermissionDialog()
}
})
},
showPermissionDialog() {
uni.showModal({
title: '提示',
content: '获取定位失败,是否授权打开定位',
success: (res) => {
if(res.confirm) {
this.openSystemSettings()
}
}
})
},
openSystemSettings() {
// 原有跳转系统设置的代码
}
},
onShow() {
this.getLocation()
}


