2014-04-07 27 views
7

我正在尝试使用Google's example: Creating & Monitoring Geofences来测试地理栅栏功能。我已经上传了code here在Google的Geofencing教程中没有看到地理栅栏切换

问题是我从来没有收到进入或退出的通知。我有Wifi,4G和GPS。我试图用以下方法测试:

  1. 我甚至走出我的房子约50英尺,然后走回去 - 但没有通知。我可以看到播放服务连接,甚至"GeofenceUtils.ACTION_GEOFENCES_ADDED in MainActivity.java"被触发,所以我认为Geofences正在被正确添加。
  2. 在设置中启用模拟位置,并使用该Fake GPS App和改变的位置 - 从相同的坐标作为Geofence1开始,然后完全超出(在另一个州)设置的东西 - 但我还是没有得到一个退出通知。

我在做什么错? ANYONE成功运行这个Google's example: Creating & Monitoring Geofences。我已经上传了code here以方便浏览。

我只是想学习区域范围设定 - 检测进入&退出。 我将标记任何答案作为我可以用于在我的实际设备上进行接口工作的正确答案

I enter the coordinates and radius below

+1

实际上在android示例代码中存在一个错误。您不应该使用IntentService类来进行通知和转换。使用BroadCastReceiver替换它。同样的问题张贴在这里 - http://stackoverflow.com/questions/19505614/android-geofence-eventually-stop-getting-transition-intents – Pankaj

+0

你能告诉我你是如何解决这个问题的? – Hunt

+0

我没有,这就是为什么我没有把下面的答案标记为正确的答案。我需要在某个时候重温这个......对不起。如果你找到一个方法,如果你可以发布解决方案,那将是非常棒的。 – user1406716

回答

0

Initally我的代码正在运行smoothy但在那之后我也搞定这个问题,请通过修改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(); 
      } 
+0

我收到了一次通知,但无法再次获取。你如何测试你的应用程序?您是使用模拟位置应用还是实际从地理围栏坐标走开?你走多远? – user1406716

+0

我实际上已经远离了地理围栏坐标,并且走开了,取决于您给出的半径,我给出了10米半径 – Priya

+0

是一个类似于5米或10米的半径为您工作的?当你走进去 - 你看到单独的通知显示进入和退出? – user1406716

15

我还具有与所述示例代码问题的接收器。我的主要问题之一是宣布ReceiveTransitionsIntentService。你并不需要添加一个BroadcastReceiver或请求位置更新,但是你需要改变你的AndroidManifest将导出值设置为true,像这样:

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

确保路径服务也是正确的。

我显著简化了谷歌例子,你可以找到的代码和解释here。我已经删除了UI组件和持久Geofence存储,所以这个例子应该更容易遵循。希望这可以帮助!

+0

嘿你的博客真的很有帮助,谢谢。然而,我认为在那里有一个错误 - 在清单部分列出了 ..'android:exported =“false”'。我认为你的意思是'真的'。谢谢! – Steven

+0

非常感谢您的博客文章! –

+0

@mari我不明白这可能有什么不同?我的意思是,我试过了,没有骰子。 –

-4

如您所见,Google重写了位置逻辑,这是新的API。看起来它是作为“共享”位置提供者工作的(LocationRequest#setFastestInterval可以为您提供坐标,如果有其他应用程序请求它,或者您可以使用PRIORITY_NO_POWER flag接收坐标)。

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

所以,你应该使用要求坐标:

LocationServices.FusedLocationApi.requestLocationUpdates 
+1

这是不正确的,你*不*必须请求LocationUpdates为系统发送geofence意图。 – akent

+0

@akent如果我不请求位置更新我没有从系统接收地理围栏意图,但如果我打开任何请求位置的应用程序(如地图),或者我只是从我的应用程序打开位置更新,它会开始触发。你确定你说过吗?你是如何使它工作的? – Juancho

0

我也有与地理栅栏API同样的问题。最后,我使用了LocationManager的addProximityAlert。它确实工作得很好!