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

标签 android android-emulator location 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***
            }
    });
}

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

我已经:

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

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

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

最佳答案

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

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

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

关于Android 应用无法使用 FusedLocationApi 访问模拟器上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41559767/

相关文章:

java - 如何在 ChromeDriver 使用 Appium 和 Android Studio 上禁用保存密码

android - 如何去除 SQLite 查询中的特定情况

java - 如何在弹出菜单中动态添加单选按钮?

Android - ListView - 按需调用 getView()

安装 WSL2 后,Android Studio 模拟器无法在 Windows 11 上运行

android - 升级数据库时显示进度对话框

android - angular2-seed-advanced 中的 Telerik-UI 侧抽屉(Android 设备)

windows - 如何在 Windows 7/Vista 上以编程方式挂载 WebDAV 共享而不分配驱动器号?

android - 如何从 Android 手机读取所有 SSL 流量?