地理围栏示例应用程序不适用于模拟位置
Posted
技术标签:
【中文标题】地理围栏示例应用程序不适用于模拟位置【英文标题】:Geofencing sample app is not working with mock location 【发布时间】:2013-07-08 10:10:06 【问题描述】:问候
我有一部带有 google play 服务的 ICE Cream 三明治手机。
从以下位置安装 Geofencedetection 示例应用程序 http://developer.android.com/training/location/geofencing.html
我还安装了一个模拟位置应用程序
使用这个模拟位置,我将我的位置设置为新德里(纬度 28.66 长 77.21)。
现在我使用示例应用注册了以下地理围栏
地理围栏1 纬度 11.94898 多头 79.48475 半径1000米
地理围栏2 纬度 77.00000 多头 77.00000 半径1000米
现在我再次打开模拟位置并设置 位置为(在地理围栏 1 内)我的家。 纬度 11.94898 长 79.48475
我已经使用地图应用程序检查了模拟位置。 它显示正确。我启用了允许模拟位置 在开发者选项中
但是示例地理围栏应用程序没有触发任何 通知。我检查了代码。根据它应该发送的代码 用户进入地理围栏时的通知。
我不明白为什么它不发送通知。 这只适用于真实网络吗?
如果我做错了什么请告诉我?
最好的问候 乔蒂
【问题讨论】:
【参考方案1】:我在使用来自
的示例 MockLocation 应用程序时也有类似的经历http://developer.android.com/training/location/location-testing.html
例如,如果我的地理围栏设置为 5,100,并且我使用模拟定位应用程序在 5,100 处注入单个模拟位置,则地理围栏将不会触发。
但是,如果您在 5,100 处反复注入多个模拟位置,则会触发地理围栏。就我而言,连续三次在 5,100 处注入模拟位置会触发我的地理围栏。需要明确的是,当我说注入时,我的意思是:
mLocationClient.setMockLocation(yourMockLocation);
以下所有内容纯属我的猜测,因此请持保留态度: 我的猜测是 LocationClient 后端有一些过滤算法,其目的是过滤掉虚假的传感器值,它可能会检测到纬度/经度的巨大变化作为可能的虚假值。另一种可能性是地理围栏在收到多个读数表明您在其附近时才会触发。
【讨论】:
【参考方案2】:当应用程序在前台时,请检查应用程序的通知,因为我也没有在后台获得任何地理围栏更新。但在前台,它工作正常。
【讨论】:
【参考方案3】:我已经被这个问题困扰了一段时间。然后最终结果是谷歌模拟位置教程(http://developer.android.com/training/location/location-testing.html)没有提到您需要使用您创建的模拟位置设置以下两个调用:
/*
setElapsedRealtimeNanos() was added in API 17
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
newLocation.setTime(System.currentTimeMillis());
如果没有这两个调用,我的模拟位置将不会触发我的地理围栏。调用这些后,我的地理围栏被触发而没有问题。
【讨论】:
【参考方案4】:我也有类似的使用 MockLocation 应用程序的经验,只是在“发送间隔”字段上使用大量秒数,比如 7 秒,地理围栏就会触发。
【讨论】:
【参考方案5】:在这上面花了很多时间后,我终于发现秘诀是在创建模拟位置实例时使用提供者名称“network”。
Location location = new Location("network");
【讨论】:
以上是关于地理围栏示例应用程序不适用于模拟位置的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 12/API 31 中,地理围栏不适用于 IMMUTABLE 未决意图。为啥?