Android应用无法使用FusedLocationApi访问模拟器上的位置

Can*_*ğlu 11 android location android-emulator fusedlocationproviderapi android-fusedlocation

我有一个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***
            }
    });
}
Run Code Online (Sandbox Code Playgroud)

在设备上运行时(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(命令工作,继续阅读,看看为什么)

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

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

sta*_*ext 8

我在模拟器上遇到了同样的问题。我发现的唯一解决方法是使用 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,但没有结果! (3认同)