首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FusedLocationProviderApi中设置模拟位置

在FusedLocationProviderApi中设置模拟位置
EN

Stack Overflow用户
提问于 2015-09-01 01:28:36
回答 1查看 3.4K关注 0票数 7

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

代码语言:javascript
复制
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)的调用都会设置我的侦听器将接收到的模拟位置。不幸的是,事实并非如此,听众保持沉默。

我设置模拟位置的简单方法(或者我是这么认为的)如下所示:

代码语言:javascript
复制
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));
}

方法成功返回,但侦听器未收到任何位置。我真的不知所措。最糟糕的部分是测试有时会通过,但非常随机(在这种情况下,执行多次的相同代码将在随后的调用中通过并失败)。为了完整起见,我的调试清单具有以下权限:

代码语言:javascript
复制
<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" />

我已经允许在设置中使用模拟位置。

EN

回答 1

Stack Overflow用户

发布于 2020-05-19 11:41:02

这是一个更新的kotlin版本。请注意,您需要在开发选项中选择应用程序作为模拟位置提供程序,并在调试清单文件中设置执行此操作的权限。

代码语言:javascript
复制
<?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>

在onCreate中,活动将有一个带有初始值设定项的val

代码语言:javascript
复制
  private lateinit var fusedLocationClient: FusedLocationProviderClient

在oncreate()中

代码语言:javascript
复制
  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() }

最后还有一种模拟位置的方法

代码语言:javascript
复制
 private fun setMockLocation(location: android.location.Location) {
    fusedLocationClient.setMockLocation(location)
        .addOnSuccessListener { Log.d(TAG, "location mocked") }
        .addOnFailureListener { Log.d(TAG, "mock failed") }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32316694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档