安卓应用无法使用FusedLocationApi在模拟器上获取位置信息

16

我有一个获取位置信息的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(命令可行,请继续阅读以了解原因)

我仍然无法让我的应用程序获得位置更新。我尝试了模拟器内置的 Google 地图,它完美地获得了位置更新,当我通过 geo fix 发送不同的坐标时,我可以立即看到地图上当前位置的变化。

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


请检查您的模拟器是否安装了Google Play服务。如果已经安装,请更新它。 - Jitesh Mohite
@jiteshmohite 它连接到服务没有错误,所以我猜它有。 - Can Poyrazoğlu
1
有关此事有任何更新吗?我在使用的所有模拟器上都看到了相同的行为。 - Brandon Scott
@BrandonScott 很不幸,我在找了很久之后放弃了。我尝试使用设备,但当设备不可用时,在模拟器测试时将一些坐标硬编码到代码中。虽然我很想看到一个解决方案。 - Can Poyrazoğlu
@Can Poyrazoğlu 我也是,应用程序连接到客户端,telnet geo fix 在模拟器上的地图上运行良好,但 onLocationChanged() 从未被调用。到目前为止有找到解决方案的运气吗? - Konaras
我仍然遇到同样的问题... - Howard Swope
1个回答

9

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

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

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


3
如果我使用这个代码没有得到更新,还有其他建议吗?我的代码是:如果(!Emulator()) lr.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY else // 强制模拟器使用高精度定位,因为qemu只提供GPS结果 lr.priority = LocationRequest.PRIORITY_HIGH_ACCURACY。我记得以前会在某种情况下得到onLocationResult回调,但现在我的回调只能得到onLocationAvailability,却没有结果! - androidguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接