在 FusedLocationProviderClient 中以编程方式设置模拟位置

Posted

技术标签:

【中文标题】在 FusedLocationProviderClient 中以编程方式设置模拟位置【英文标题】:Setting a mock location programmatically in FusedLocationProviderClient 【发布时间】:2018-11-20 21:27:18 【问题描述】:

我正在尝试在我的应用中使用模拟位置进行测试。为了接收位置更新,我在这里使用了最新的 android 开发者文档: https://developer.android.com/training/location/receive-location-updates

本教程以 FusedLocationProviderClient 和 locationClient.requestLocationUpdates(createLocationRequest(), locationCallback, null) 为例。

问题是我不能再使用权限了:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

因为我收到错误“权限仅授予系统应用程序”(我也在调试模式下尝试过)

所以我尝试了下面的代码,但它不起作用:

    locationClient.setMockMode(true);

    String[] tokens = location.split(",");
    Location newLocation = new Location(LocationManager.GPS_PROVIDER);
    newLocation.setLatitude(Float.parseFloat(tokens[0]));
    newLocation.setLongitude(Float.parseFloat(tokens[1]));

    newLocation.setAccuracy(3.0f);

    newLocation.setTime(System.currentTimeMillis());


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) 
        newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    
    locationClient.setMockLocation(newLocation);

有人知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

好像加了

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

即使 Android Studio 说“权限仅授予系统应用程序”,调试 android manifest 的权限也能正常工作。

所以解决方案是,添加后运行应用程序,然后转到设置/开发人员选项/选择模拟位置应用程序 -> 这里出现我的应用程序,我可以选择它。

希望其他人能够确认并使用这个!

【讨论】:

对我没用 - 应用出现在模拟位置,但是在设置模拟位置时应用崩溃,“com.app.package. from uid 10094 not allowed to perform MOCK_LOCATION” 更新(无法删除downvote) - 基本上设备将应用程序的名称显示为模拟位置应用程序,并在设置模拟位置时崩溃。但是,当我手动将其设置为模拟位置应用程序时(即使它已经显示为模拟位置应用程序!),它没有崩溃。所以上面的答案确实有效。如果可以的话,我会重新投票。另外,请记住将位置模式设置为仅设备 - 否则模拟位置将被真实位置覆盖。

以上是关于在 FusedLocationProviderClient 中以编程方式设置模拟位置的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据