Android应用无法使用FusedLocationApi

时间:2017-01-10 01:26:31

标签: 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完成从未调用过。)

我'已经:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

<强>说明: 它是唯一可以强制Android打开GPS芯片的选项(在模拟器的情况下是虚拟芯片)。在真实设备上,这不是问题,因为手机可以使用手机接收和wifi来找出大致的位置。在仿真器上没有小区接收,并且wifi被抽象为网络连接。因此,模拟器几乎只能使用GPS进行定位。

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