在 Google 的地理围栏教程中没有看到地理围栏转换

Posted

技术标签:

【中文标题】在 Google 的地理围栏教程中没有看到地理围栏转换【英文标题】:Not seeing Geofence Transitions in Google's tutorial on Geofencing 【发布时间】:2014-05-19 06:24:02 【问题描述】:

我正在尝试使用Google's example: Creating & Monitoring Geofences 测试地理围栏功能。我已经上传了code here。

问题是我从来没有收到进入或退出的通知。我有 Wifi、4G 和 GPS。我尝试通过以下方式进行测试:

    我什至走出我的房子大约 50 英尺然后走回去 - 但没有通知。我可以看到播放服务已连接,甚至"GeofenceUtils.ACTION_GEOFENCES_ADDED in MainActivity.java" 也已触发,因此我认为地理围栏已正确添加。 在设置中启用了模拟位置并使用了这个Fake GPS App 并更改了位置 - 从与 Geofence1 相同的坐标开始,然后设置到完全外部的位置(在另一种状态下) - 但我仍然没有收到退出通知。

我做错了什么?任何人都成功地运行了这个Google's example: Creating & Monitoring Geofences。我已经上传了code here,方便浏览。

我只是想学习地理围栏 - 检测进入和退出。 我会将任何答案标记为我可以用来在我的真实设备上运行地理围栏的正确答案

.

【问题讨论】:

其实android示例代码有一个bug。你不应该使用IntentService类进行通知和转换。用BroadCastReceiver替换它。同样的问题在这里发布-***.com/questions/19505614/… 你能告诉我你是怎么解决这个问题的吗? 我没有,这就是为什么我没有将以下答案标记为正确答案。我需要在某个时候重新审视这个......对不起。如果你找到了一种方法,如果你能发布一个解决方案,那就太棒了。 @user1406716 问题解决了吗? @Hunt 不,我运气不太好,我以后可能会回到这个。如果我这样做,会在这里更新。 【参考方案1】:

我也遇到了示例代码的问题。我遇到的主要问题之一是声明 ReceiveTransitionsIntentService。您无需添加 BroadcastReceiver 或请求位置更新,但您需要更改 AndroidManifest 以将导出的值设置为 true,如下所示:

<service
    android:name=".ReceiveTransitionsIntentService"
    android:exported="true" >
</service>

确保服务的路径也正确。

我已经大大简化了 Google 示例,您可以找到代码和解释 here。我已经删除了 UI 组件和持久的地理围栏存储,所以这个例子应该更容易理解。希望这会有所帮助!

【讨论】:

嘿,你的博客真的很有帮助,谢谢。但是,我认为那里有一个错误-在清单部分中,它列出了&lt;service ..android:exported="false"。我想你的意思是true。谢谢! 非常感谢您的博文! @mari 我不明白这可能有什么不同??我的意思是,我试过了,没有骰子。 这是一个很好的答案...让 android:exported="true" 解决了这个问题 我同意其他发布的内容。这是正确的答案。 Android Studio 在创建 IntentService 时放置android:exported="false"。您必须进入 Manifest 并将其更改为 true。这个答案应该被标记为解决方案。【参考方案2】:

最初我的代码运行流畅,但之后我也遇到了这个问题,请通过修改 continueAddGeofences() 函数中的 geofenceRequester 类来尝试这个。 基本上就是通过位置请求方法调用接收方

 private void continueAddGeofences() 


            // Get a PendingIntent that Location Services issues when a geofence
            // transition occurs
            mGeofencePendingIntent = createRequestPendingIntent();

            // Send a request to add the current geofences
            mLocationClient.addGeofences(mCurrentGeofences, mGeofencePendingIntent,
                    this);
            //mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            try 
                LocationRequest locationrequest = LocationRequest.create();
                locationrequest.setPriority(locationrequest.PRIORITY_HIGH_ACCURACY);
                 locationrequest.setInterval(3000);


                mLocationClient.requestLocationUpdates(locationrequest, mGeofencePendingIntent);
             catch (Exception e) 
                e.printStackTrace();
            

【讨论】:

我收到了一次通知,但无法再次收到。你如何测试你的应用程序?您是在使用模拟位置应用程序还是实际上远离地理围栏坐标?你要走多远? 我实际上是从地理围栏坐标走开,走开取决于你给出的半径,我给出了 10m 的半径 5m 或 10m 这样的半径适合您吗?当您进出时 - 您会看到显示进入和退出的单独通知???? 不,通知替换现有的取决于进入或退出 @SpunkyPriya 我需要更改 BroadcastReceiver 中的内容吗?【参考方案3】:

Geofence api 也有同样的问题。最后,我使用了 LocationManager 的 addProximityAlert,效果很好!

【讨论】:

【参考方案4】:

如您所见,Google 重新设计了位置逻辑,这是新的 API。似乎它作为“共享”位置提供者工作(LocationRequest#setFastestInterval 可以在任何其他应用程序请求时为您提供坐标,或者您可以通过PRIORITY_NO_POWER flag 接收坐标)。

Geofence API 就像helper 方法,你不需要自己开发类似的逻辑(计算半径等)。但是,Geofence 本身并不请求坐标,它只是使用接收到的坐标(即来自其他应用程序)。方法命名不言自明:LocationServices.GeofencingApi.addGeofences; => addGeofences,而不是 requestGeofences

因此,您应该使用以下方式请求坐标:

LocationServices.FusedLocationApi.requestLocationUpdates

【讨论】:

这不正确,您不必必须请求LocationUpdates 系统才能向您发送地理围栏意图。 @akent 如果我不请求位置更新 我没有收到来自系统的地理围栏意图但是如果我打开任何请求位置的应用程序(如地图)或者我只是打开位置更新我的应用程序,它开始触发。你确定你说的?你是怎么做到的?

以上是关于在 Google 的地理围栏教程中没有看到地理围栏转换的主要内容,如果未能解决你的问题,请参考以下文章

应用程序死机时的地理围栏

安卓地理围栏系统(Google Play Services)能否在手机休眠时触发事件

Android:制作地理围栏的简单方法?

当您走进地理围栏时,如何为简单的信息敬酒?

应用程序在后台 ios 中时地理围栏不起作用

地理围栏 - 检查用户是不是已经在围栏内