gpt4 book ai didi

android - 在 FusedLocationProviderApi 中设置模拟位置

转载 作者:行者123 更新时间:2023-12-03 14:50:50 27 4
gpt4 key购买 nike

我正在尝试从 FusedLocationProviderApi 获取模拟更新,但我似乎无法让它工作。这是我在 android 仪器测试中的设置方法:

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));
}

方法成功返回,但监听器没有收到任何位置。我在这里真的很茫然。最糟糕的部分是有时测试会通过,但非常随机(以至于多次执行的相同代码会在后续调用中通过并失败)。为了完整起见,我的调试 list 具有以下权限:
<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" />

我在设置中允许模拟位置。

最佳答案

这是我们更新的 kotlin 版本。请注意,您需要在开发选项中选择应用程序作为模拟位置提供程序,并有权在调试 list 文件中进行设置。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
tools:ignore="ProtectedPermissions" />
</manifest>

Activity 将在 onCreate 中有一个带有初始化程序的 val
  private lateinit var fusedLocationClient: FusedLocationProviderClient

在 oncreate()
  fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)


fusedLocationClient.setMockMode(BuildConfig.DEBUG)

fusedLocationClient.lastLocation
.addOnSuccessListener { location : android.location.Location? ->
// Got last known location. In some rare situations this can be null.
Toast.makeText(this, location.toString(), Toast.LENGTH_SHORT).show()

}
.addOnFailureListener { Toast.makeText(this, "failed", Toast.LENGTH_SHORT).show() }

最后是一种模拟位置的方法
 private fun setMockLocation(location: android.location.Location) {
fusedLocationClient.setMockLocation(location)
.addOnSuccessListener { Log.d(TAG, "location mocked") }
.addOnFailureListener { Log.d(TAG, "mock failed") }
}

关于android - 在 FusedLocationProviderApi 中设置模拟位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32316694/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com