使用Google Play服务6.5.+测试地理围栏技术

27

我一直在测试最新版Google Play服务中提供的地理围栏API,使用官方示例 https://github.com/googlesamples/android-Geofencing/ 当然,我也遵循了http://developer.android.com/training/location/geofencing.html提供的培训课程。

示例代码是在你接近旧金山的两个Google建筑物时显示通知,所以我对其进行了调整,使其在我接近家或工作场所时触发。

如果我使用真实设备,一切正常。通知会被正确触发。但是,当我使用模拟器并使用telnet或ddms更改位置时,什么都不会发生。我还尝试了安装了Gapps的Genymotion,结果也一样:什么都没有发生。

是否有人能提供关于如何在不实际移动身体的情况下测试地理围栏的任何指针?因为在街上,没有办法调试代码...


11
笑“不用真的动我的屁股?” - Reed
你尝试过模拟你的位置吗?我推荐两个应用程序:Fake GPS locationFake Location Spoofer Free(第二个应用程序与 Google Play 服务兼容)。 - Ziem
使用虚假GPS位置或其他位置模拟器并不能帮助我测试所有内容,因为即使它能正常工作(仍需尝试),它也需要切换应用程序,这意味着我无法真正测试我的应用程序在前台的情况下会发生什么。 - Redwarp
@Redwarp 请查看我的答案,并将其标记为答案,这样如果其他人有相同的问题,他们就可以看到它。 - Sid
@Assa 我不认为你的回答是我寻求的答案,而且我也不认为如果我给了你这400点赏金,toobsco42会很高兴,因为这样一个简短的答案。嘲笑位置似乎有效,但它并没有触发地理围栏。 - Redwarp
显示剩余2条评论
6个回答

12
以下是您需要做的:
  1. 设置 -> 开发人员选项 -> 允许模拟位置

  2. 添加以下权限:

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

  1. 确保您的GPS位置服务已开启(高精度),不是网络位置

  2. 从应用商店下载一个名为“Fake GPS”的应用程序(它有一个黄色的快乐表情,握着遥控器)。您可以使用该应用程序设置虚假GPS。

希望这回答了您的问题 :)

你的回答基本上和@araks的一样,他给了更多的细节 ^_^ 不管怎样还是谢谢。 - Redwarp
他只是通过adb提到了第4点。我想确保你已经设置好了一切,不必再通过adb操作...我猜你没有尝试我的回答或发现它有帮助。好的。 - Snake
哦,抱歉,我并不是要听起来很苛刻或者什么的,任何帮助都非常感激。只是想解释一下为什么我不会选择你的答案作为“最佳答案”。 - Redwarp
没问题。明白了。当然要选择解决你问题的答案。祝你好运。 - Snake
这些步骤对我来说很有效,设置过程中很容易忘记包含某个步骤。我使用了 Lockito,像其他人提到的那样。Lockito 有一个持久通知,因此我可以在前台运行我的应用程序,拉下通知栏,并从 Lockito 通知中点击“播放”以启动模拟路线。我的前台应用程序可以正常看到“移动”。 - Robert
好的,这是为了在真实设备上测试地理围栏,对于我的情况实际上更好。谢谢。 - Dezo

9
我遇到了同样的问题,如果你拥有一个设备,你可以通过在设置中启用模拟位置来轻松地伪造位置。
设置->开发者选项->允许虚假位置
同时,您还需要在清单中添加以下内容:
 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 

我从未在模拟器上尝试过,但是请尝试打开模拟器并执行相同的操作(进入设置并启用模拟位置),祝你好运!


2
我知道您可以在开发者选项中允许模拟位置,但是如何在设备上模拟像GPX路线这样的东西呢? - Etienne Lawlor
如何在剂量模式下进行测试? - Rohit
1
添加模拟位置权限时,我收到以下错误提示:该权限仅授予系统应用程序。 - Rule
2
@Rule 你应该覆盖Manifest文件,放在debug或test文件夹中,并在构建变量的Manifest文件中包含该权限。从Android Studio: "Mock位置应仅在测试或特定于调试的清单文件(通常为src/debug/AndroidManifest.xml)中请求" - Payne Miller

6

测试地理围栏时,我差点放弃了...

而实际上我并没有移动我的屁股

...但通过深入研究,我找到了一个解决方案(虽然不是最优解)。

与常规位置更新相比,地理围栏的问题在于它们需要一个小 "poke" 才能工作。

地理围栏依赖于其他应用程序和操作系统。如果没有应用程序主动请求位置更新,且安卓系统“认为”它处于同一位置(模拟器上始终如此),则围栏不会触发。

所以有两个解决方案:

  • 在调试期间主动请求位置更新

  • 在多窗口模式下打开谷歌地图,并在输入纬度/经度并在模拟器设置中点击发送后,点击“我的位置”按钮

当然,其他答案中提到的事情都是必须的(高精度)。

希望这个答案能为其他开发者节省一些时间 :)


这是对我有效的方法!我必须在Google Maps应用程序上登录,然后通过点击“我的位置”按钮请求位置更新。 - Hashim Akhtar

4
该应用程序Lockito可帮助模拟路线以测试Geofencinghttps://play.google.com/store/apps/details?id=fr.dvilleneuve.lockito 您需要打开允许虚假位置 设置->开发人员选项->允许虚假位置
我发现您可以沿路线设置平均速度以加快模拟速度,但是如果速度过快,则可能不会触发或延迟触发Geofencing进入和退出。我还将Geofence半径设置为至少40米,以确保触发器正常工作。
使用Lockito,如果您设置的速度过快,则当前位置(地图上的蓝点)更新不够及时。因此,请先将其设置为较低的速度,然后运行,然后提高速度并运行。

3
Lockito破解了最新版Google Play的地理围栏功能。 - desgraci
@desgraci,没错,当我点击“播放行程”时,我的地理围栏被移除了,并且我收到了一个GEOFENCE_NOT_AVAILABLE的调用。我不得不转移到另一个虚拟GPS应用程序(https://play.google.com/store/apps/details?id=com.lexa.fakegps)。 - Mateus Gondim
@MateusGondim,这对我没用,因为它需要切换应用程序,而我需要在前台测试,但还是谢谢 :) - desgraci

3
我发现在Android模拟器上设置虚拟位置最简单的方法是使用一个专门用于此目的的小应用程序。
当测试具有基于位置的功能的应用程序时,我使用 Fake GPS location
您可以从镜像(在Google中搜索com.lexa.fakegps.apk)下载 apk ,然后使用以下命令将其安装到模拟器中:
adb install com.lexa.fakegps.apk

它的功能非常好。 从来没有像使用telnet或DDMS设置虚假位置那样遇到更多问题,而且由于可以使用简单的GUI而不是终端命令,所以更加容易! 编辑: 如果您需要在单元测试中自动设置位置,则可以使用以下意图:
Intent startIntent = new Intent();
startIntent.setAction("com.lexa.fakegps.START");
startIntent.putExtra("lat", 56.1234);
startIntent.putExtra("long", 44.0011);
startService(startIntent);

Intent stopIntent = new Intent();
stopIntent.setAction("com.lexa.fakegps.STOP");
startService(stopIntent);

祝你测试愉快!

Mattia


我唯一看到使用外部应用程序的问题是,当您的应用程序处于前台时,没有办法测试其行为。因为您需要将“Fake GPS Location”置于前台以更改位置... - Redwarp
2
@Redwarp 您可以使用以下两个命令自动化您的测试:am startservice -a com.lexa.fakegps.START -e lat 56.1234 -e long 44.0011am startservice -a com.lexa.fakegps.STOP链接 - araks

3

我花了两天时间试图在Android Studio模拟器上测试我的地理围栏应用程序,并最终成功了。

该设备具有默认的Play服务(我的意思是我使用它创建了虚拟设备)。

我解决了这个问题,进入 "Google设置" > 位置 > 模式

并将其从“仅设备”更改为“高精度”

这样我的应用程序终于可以工作了。希望能对你有所帮助。


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