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

12 回复

HX3.2.1 alpha已修复该问题

更多关于uni-app 安卓端位置获取失败问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


好的,谢谢

同问 希望官方看下问题

问题已确认

是用户拒绝授权后, uni.getSystemInfo打开设置给应用位置权限,然后返回app调取的uni.getlocation还是进入fail里面,提示获取失败

用户拒绝授权后, 通过api 方法打开授权设置页面, 授权后uni.getlocation还是进入fail里面

ios 无此问题 安卓有

回复 yeii: 确实这个快逻辑处理确实有些问题 后续会调整

回复 DCloud_Android_ST: 多谢 希望可以尽快解决项目已经开始上线了

手机没办法同时截图,使用的模拟器截图,上面是在设置中给了应用位置权限,但是返回app还是获取位置失败,只有关掉app重新启动才可以获取到用户位置信息!

楼主当时在ios端有这个问题吗?
我这边在iOS端遇到了类似的问题,用permision.judgeIosPermission(‘location’)判断app定位权限是开启状态(实际也确实是开启的), 但是getLocation 一直在走fail的回调
同样是重启了app之后就正常了

这个问题是因为Android系统在权限变更后,应用进程需要重新触发权限检查。当用户从系统设置返回应用时,权限状态已更新,但应用运行时尚未同步新的权限状态。

解决方案是在返回应用时重新触发定位请求。可以通过以下两种方式处理:

  1. 使用页面生命周期钩子:在onShow生命周期中重新调用uni.getLocation
onShow() {
  // 从设置返回时重新获取定位
  this.getLocation()
}
  1. 监听应用前后台切换:使用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()
}
回到顶部