【问题标题】:Android app can't access location on emulator using FusedLocationApiAndroid 应用无法使用 FusedLocationApi 访问模拟器上的位置
【发布时间】:2017-05-24 09:47:00
【问题描述】:

我有一个可以获取位置的 Android 应用:

private LocationRequest createLocationRequest() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(120000);
    mLocationRequest.setFastestInterval(60000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    return mLocationRequest;
}

private GoogleApiClient getLocationApiClient(){
    return new GoogleApiClient.Builder(App.instance)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

...

apiClient = getLocationApiClient();
apiClient.connect();

 @Override
public void onConnected(@Nullable Bundle bundle) {
   ...
   LocationRequest locationRequest = createLocationRequest();
   LocationServices.FusedLocationApi.requestLocationUpdates(apiClient, locationRequest, new LocationListener() {
            @Override
            public void onLocationChanged(Location newLocation) {
                //***THIS IS NEVER CALLED ON EMULATOR***
            }
    });
}

在设备(Galaxy S3、Android 4.4.4)上运行时完全没有问题。在模拟器上运行时(Android Studio 默认 qemu、Android 7.1、x86-64)我没有在我的应用程序上获取位置。 onConnected 被调用,我什至可以读取最后一个位置,虽然我不会得到任何位置更新(requestLocationUpdates 完成从未调用)。

我已经:

  • 在清单中添加了<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />(除了粗略和精细位置)。
  • 尝试在模拟器上更改 Google 位置设置(高精度、省电、仅限设备)
  • 尝试从模拟器的 GUI 设置位置。
  • 尝试打开和关闭模拟器的“使用检测到的 ADB 位置”选项。
  • 试过adb -s emulator-5555 emu geo fix 12.34 56.78(命令有效,继续阅读以了解原因)

我仍然无法让我的应用获取位置更新。我已经尝试了模拟器的内置谷歌地图,它可以完美地更新位置,当我通过地理修复发送不同的坐标时,我可以看到地图上的当前位置立即发生变化。

但我的应用完全不知道位置更新。在发送另一个坐标之前,我已经尝试等待至少 2 分钟(我的位置请求间隔)。我做错了什么?

【问题讨论】:

  • 请检查您的模拟器中是否有google play服务。如果你有然后更新它。
  • @jiteshmohite 它连接到服务没有错误,所以我猜它有它
  • 这方面有什么更新吗?在我使用的所有模拟器上看到相同的行为。
  • @BrandonScott 不幸的是,我在没有找到任何东西后放弃了。我尝试使用该设备,当不可用时,在模拟器中测试时将一些坐标硬编码到代码中。不过我很想看到一个解决方案。
  • @Can Poyrazoğlu 同样在这里,应用程序连接到客户端,telnet geo fix 工作正常(在模拟器上的地图上测试),但是永远不会调用 onLocationChanged()。到目前为止找到解决方案的运气好吗?

标签: android android-emulator location fusedlocationproviderapi android-fusedlocation


【解决方案1】:

我在模拟器上遇到了同样的问题。我发现的唯一解决方法是使用 PRIORITY_HIGH_ACCURACY。

解释: 这是唯一会强制 android 打开 GPS 芯片(模拟器中的虚拟芯片)的选项。在真实设备上,这不是问题,因为手机可以使用手机接收和 wifi 来确定大致位置。在模拟器上没有手机接收,wifi 被抽象为只是一个网络连接。所以模拟器几乎只能使用 GPS 来定位。

如果您真的不想在实际应用程序中使用 PRIORITY_HIGH_ACCURACY,您可以为 FusedLocationApi 创建(或查找示例应用程序),并将精度设置为 PRIORITY_HIGH_ACCURACY。在运行实际应用程序之前运行它(PRIORITY_BALANCED_POWER_ACCURACY),将会有一个最后一个已知位置可用。

【讨论】:

  • 如果我使用这个并且没有更新,还有什么建议吗?我的代码: if (!Emulator()) lr.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY else // 强制模拟器为高精度,因为 qemu 只为 GPS lr.priority = LocationRequest.PRIORITY_HIGH_ACCURACY 提供结果。我似乎记得以前以某种方式获取onLocationResult,但目前,我的回调获取onLocationAvailability,但没有结果!
猜你喜欢
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多