uni-app 安卓第一次调用uni.getLocation无响应,success和fail均未触发,却触发了App.vue中的onShow

uni-app 安卓第一次调用uni.getLocation无响应,success和fail均未触发,却触发了App.vue中的onShow

项目信息 详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows11
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 Android
手机系统版本号 Android 14
手机厂商 华为
手机机型 华为nova4e
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

uni.getLocation({  
    type: 'wgs84', // 使用WGS84坐标系  
    geocode: true, // 是否需要地理编码  
    isHighAccuracy: true, // 是否需要高精度定位  
    success: (res) => {  
        if (res.longitude && res.latitude) {  
            console.log('经纬度', res.longitude, res.latitude )  
        } else {  
            console.log('获取失败' )  
        }  
    },  
    fail: (err) => {  
        console.log(err);  
    }  
})

操作步骤:

  • 安卓用户第一次申请定位授权,点击允许后调用uni.getLocation,此函数没有任何信息返回,就像没有触发一样。

预期结果:

  • 打印经纬度,或者打印错误信息。获取经纬度信息。

实际结果:

  • success和fail都没有触发,却触发了App.vue的onShow。

bug描述:

  • uni.getLocation第一次在安卓机上调用时,success和fail都不会触发。失败了你返回个失败结果也行啊,啥都没有就卡在那里,还触发了app.vue里的onShow。

更多关于uni-app 安卓第一次调用uni.getLocation无响应,success和fail均未触发,却触发了App.vue中的onShow的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

提供下复现工程,并说明 vue 和 HBuilderX 版本和运行的平台,你测试了几台安卓设备,是都不行还是个别不行,按住模拟器正常吗,ios 正常吗,

更多关于uni-app 安卓第一次调用uni.getLocation无响应,success和fail均未触发,却触发了App.vue中的onShow的实战教程也可以访问 https://www.itying.com/category-93-b0.html


ios正常。目前试的华为mate60,小米14,oppo是正常的。 只有华为nova4e出现了问题。 vue2,HbuilderX是4.29。

HUAWEI nova4e

在处理 uni-app 中安卓设备首次调用 uni.getLocation 无响应的问题时,确实会遇到一些特定的挑战,特别是当 successfail 回调均未触发,但触发了 App.vue 中的 onShow 方法时。这种情况通常与权限请求、系统缓存或异步调用处理不当有关。以下是一些可能的解决方案,通过代码示例来展示如何更好地处理这些场景。

1. 确保权限请求

首先,确保你的应用已经请求并获得了必要的地理位置权限。在 manifest.json 中配置必要的权限,并在代码中动态请求权限(对于需要运行时权限的安卓版本)。

// manifest.json
{
  "mp-weixin": {},
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "android.permission.ACCESS_FINE_LOCATION",
          "android.permission.ACCESS_COARSE_LOCATION"
        ]
      }
    }
  }
}

在代码中动态请求权限(使用 uni.authorizeplus.android.requestPermissions,根据uni-app版本和具体需求选择):

uni.authorize({
  scope: 'scope.userLocation',
  success() {
    getLocation();
  },
  fail() {
    console.error('用户拒绝授权');
  }
});

function getLocation() {
  uni.getLocation({
    type: 'gcj02', // 返回可以用于 `uni.openLocation` 的经纬度
    success(res) {
      console.log('位置信息:', res);
    },
    fail(err) {
      console.error('获取位置失败:', err);
    }
  });
}

2. 处理异步调用

确保 getLocation 调用是在正确的生命周期或事件处理中,避免在组件未完全挂载或权限未确认前调用。

// 在 App.vue 或页面组件的 onLoad/onReady/onShow 中调用
export default {
  onShow() {
    // 检查权限并获取位置
    checkAndRequestLocation();
  },
  methods: {
    checkAndRequestLocation() {
      // 上述的权限检查和位置获取逻辑
    }
  }
}

3. 清除缓存或重启应用

有时候,特别是开发过程中,系统缓存或应用状态可能导致一些异步调用不按预期执行。尝试清除应用缓存或重启设备看是否解决问题。

4. 调试和日志

增加详细的日志记录,帮助定位问题发生的具体环节。使用 console.log 或更高级的日志工具来跟踪函数调用和返回值。

通过上述方法,你应该能够更有效地诊断和解决 uni-app 中安卓设备首次调用 uni.getLocation 无响应的问题。如果问题依旧存在,建议检查 uni-app 的官方文档和社区,看是否有已知的bug或更新。

回到顶部