我试图从FusedLocationProviderApi
获取模拟位置更新,但似乎无法使其工作。以下是我的安卓测试设置方法:
locationProvider = new LocationProvider(InstrumentationRegistry.getTargetContext().getApplicationContext(), settings);
// Connect first, so that we don't receive 'true' location
locationProvider.googleApiClient.blockingConnect();
// Set mock mode, to receive only mock locations
LocationServices.FusedLocationApi.setMockMode(locationProvider.googleApiClient, true);
InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
// Start receiving locations; this call will connect api client, and if it's already connected (or after it connects) it will register for location updates
locationProvider.start();
}
});
// wait until we can request location updates
while (!locationProvider.isReceivingLocationUpdates) {
Thread.sleep(10);
}
在此之后,我期望任何对
LocationServices.fusedLocationApi.setMockLocation(apiClient, location)
的调用都会设置模拟位置,并且我的监听器将接收到这些位置。不幸的是,情况并非如此,监听器保持沉默。我设想的(或者我认为是)设置模拟位置的绝佳方法如下:
private void setMockLocation(final Location location) throws Exception {
assertTrue(locationProvider.googleApiClient.isConnected());
assertTrue(locationProvider.isReceivingLocationUpdates);
final CountDownLatch countDownLatch = new CountDownLatch(1);
LocationServices.FusedLocationApi.setMockMode(locationProvider.googleApiClient, true)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
assertTrue(status.isSuccess());
LocationServices.FusedLocationApi.setMockLocation(locationProvider.googleApiClient, location)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
assertTrue(status.isSuccess());
countDownLatch.countDown();
}
});
}
});
assertTrue(countDownLatch.await(500, TimeUnit.MILLISECONDS));
}
方法成功返回,但是监听器没有接收到位置信息。我真的很困惑。最糟糕的是,有时测试会通过,但极其随机(即使相同的代码执行多次,在随后的调用中也会通过和失败)。为了完整起见,我的调试清单具有以下权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
我已经在设置中允许模拟位置。
locationProvider
已经被弃用,你应该使用GoogleApiClient
代替它。你可以查看这个github页面获取示例GoogleApiClient
的实现。 - ztanlocationProvider
是我的自定义类。我使用GoogleApiClient
和FusedLocationProviderApi
来获取位置。 - wasyl