在哪里可以找到Android Studio 3.3的非弃用地理围栏示例代码?

时间:2019-01-15 07:50:39

标签: android android-studio android-location android-geofence

要问的奇怪问题,但是我找不到用于Android上的地理围栏的有效代码示例。似乎有一些官方地理围栏示例:

  1. Deprecated Android Geofencing app
  2. Sample code for Kotlin
  3. Creating and Monitoring Geofences

我继承了一个Java应用程序,因此#2对我不起作用。对于#3,在将以下内容添加到gradle.properties文件之前,我遇到了一些构建失败:

android.useAndroidX=true
android.enableJetifier=true

在构建工作正常的情况下,我尝试使用Pixel 2 API 28在模拟器上运行该应用程序。我登录Play商店,将“ Google Location Accuracy”设置为“ ON”,同时启用了Wifi和Bluetooth扫描并收到了以下日志:

2019-01-14 23:38:43.597 25221-25221/? I/mple.geofencin: Not late-enabling -Xcheck:jni (already on)
2019-01-14 23:38:43.636 25221-25221/? W/mple.geofencin: Unexpected CPU variant for X86 using defaults: x86
2019-01-14 23:38:44.134 25221-25221/com.google.android.gms.location.sample.geofencing W/mple.geofencin: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2019-01-14 23:38:44.135 25221-25221/com.google.android.gms.location.sample.geofencing W/mple.geofencin: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2019-01-14 23:38:44.328 25221-25221/com.google.android.gms.location.sample.geofencing I/MainActivity: Requesting permission
2019-01-14 23:38:44.393 25221-25221/com.google.android.gms.location.sample.geofencing D/OpenGLRenderer: Skia GL Pipeline
2019-01-14 23:38:44.470 25221-25254/com.google.android.gms.location.sample.geofencing I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-01-14 23:38:44.470 25221-25254/com.google.android.gms.location.sample.geofencing I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2019-01-14 23:38:44.471 25221-25254/com.google.android.gms.location.sample.geofencing I/OpenGLRenderer: Initialized EGL, version 1.4
2019-01-14 23:38:44.471 25221-25254/com.google.android.gms.location.sample.geofencing D/OpenGLRenderer: Swap behavior 1
2019-01-14 23:38:44.471 25221-25254/com.google.android.gms.location.sample.geofencing W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2019-01-14 23:38:44.472 25221-25254/com.google.android.gms.location.sample.geofencing D/OpenGLRenderer: Swap behavior 0
2019-01-14 23:38:44.484 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglCreateContext: 0xe14051e0: maj 3 min 0 rcv 3
2019-01-14 23:38:44.505 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglMakeCurrent: 0xe14051e0: ver 3 0 (tinfo 0xe1403660)
2019-01-14 23:38:44.679 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglMakeCurrent: 0xe14051e0: ver 3 0 (tinfo 0xe1403660)
2019-01-14 23:38:47.961 25221-25221/com.google.android.gms.location.sample.geofencing I/MainActivity: onRequestPermissionResult
2019-01-14 23:38:47.961 25221-25221/com.google.android.gms.location.sample.geofencing I/MainActivity: Permission granted.
2019-01-14 23:38:53.437 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglMakeCurrent: 0xe14051e0: ver 3 0 (tinfo 0xe1403660)
2019-01-14 23:38:53.442 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglMakeCurrent: 0xe14051e0: ver 3 0 (tinfo 0xe1403660)
2019-01-14 23:40:18.152 25221-25241/com.google.android.gms.location.sample.geofencing I/AssistStructure: Flattened final assist data: 1928 bytes, containing 1 windows, 16 views
2019-01-14 23:40:20.314 25221-25254/com.google.android.gms.location.sample.geofencing D/EGL_emulation: eglMakeCurrent: 0xe14051e0: ver 3 0 (tinfo 0xe1403660)

即使在模拟器中将位置更改为SFO / GOOGLE,在模拟器上也没有任何通知。我在onHandleWork的{​​{1}}中添加了一条打印语句,但似乎没有触发地理围栏事件。

我还尝试了使用Fake GPS的真实Pixel设备;也没有通知。因此,我的问题是,我们应该为Geofencing使用哪些示例代码?它应该可以在模拟器上运行吗?如果我将应用程序切换到后台以更改“假GPS”应用程序中的位置,它可以在真实手机上正常工作吗?

PS:我的模拟器映像已启用Google Play PPS:我也尝试过XYZ Tourist景点应用程序;当我通过模拟器更改GPS位置时,我可以看到距离发生了变化,但仍然没有任何通知。不过,我并没有对此进行深入研究。 PPPS:请帮忙!

更新1:

  • 我确实收到了地理围栏转换事件。 地图正在前台运行。我不确定这是否是因为 我正在通过模拟器设置位置...
  • (3)中的构建中断似乎是5天前更新后的googlesamples存储库中的回归。提交GeofenceTransitionsJobIntentService似乎是开箱即用的。

1 个答案:

答案 0 :(得分:1)

我已经与GeoFence合作了很长时间,我遇到了同样的问题,在尝试了不同的解决方案后我自己得到了答案。因此,基本上,如果手机中的任何应用程序正在获取地理位置信息,则GeoFence只会触发大约x的持续时间。如果您测试了由Google提供的GeoFence示例应用程序,则可以看到该应用程序仅在打开Goog​​le Maps应用程序后才能运行,因为Google Maps是设备中唯一被动请求位置的应用程序。

为了证明,您可以从下面的链接https://github.com/googlesamples/android-play-location克隆GeoFence示例和LocationUpdateForGroundService示例,同时运行它们GeoFence和LocationUpdateForGroundService,您会注意到,通过更改模拟器的经纬度,您现在注意到了不再需要打开Goog​​le地图,因为现在有另一个应用正在请求位置。

因此,请务必在GeoFence应用程序中创建前台服务,并使用Fuse Location Client请求在x持续时间内进行位置更新。