2010-07-21 51 views
3

我这样设置2个接近警报与同一个广播

private void setProximityAlert(float radius, double lat, double lng, String place) 
{ 
    long expiration = -1; 
    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Intent intent = new Intent(TREASURE_PROXIMITY_ALERT); 
    intent.putExtra("lat", lat); 
    intent.putExtra("lng", lng); 
    intent.putExtra("place", place); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), -1, intent, 0); 
    locManager.addProximityAlert(lat, lng, radius, expiration, pendingIntent); 
} 

创建一个接近警报和我的活动我注册的接收器以这种方式

IntentFilter intentFilter = new IntentFilter(TREASURE_PROXIMITY_ALERT); 
    registerReceiver(new ProximityIntentReceiver(), intentFilter); 
    setProximityAlert(10, 45.150344, 9.999815, "POINT1"); 

和我的广播接收器是正确的调用。 所以现在,我想添加另一个接近警报,这有可能吗?我希望同一个boadcast接收器被2个接近警报调用。 我做到这一点:

IntentFilter intentFilter1 = new IntentFilter(TREASURE_PROXIMITY_ALERT1); 
    registerReceiver(new ProximityIntentReceiver(), intentFilter1);   
    setProximityAlert(200f, 45.143848, 10.039741, "POINT2"); 

但它不起作用,什么也没有发生。我现在真的在想它,我想知道这是否正确。我的意图是触发2个警报,一个是GPS获得位置POINT1,另一个位于POINT2位置。 欢迎任何帮助。

回答

6

您需要使用任何独特的setAction,以便系统考虑两个不同的意图,否则将倾向于重用第一个意图。

我有这样的代码:

Intent intent = new Intent(this,PlacesProximityHandlerService.class); 
intent.setAction("foo"+objPlace.getId()); 
intent.putExtra(Poi._ID, objPlace.getId()); 
intent.putExtra(Poi.LAT, objPlace.getLat()); 
intent.putExtra(Poi.LON, objPlace.getLon()); 
PendingIntent sender = PendingIntent.getService(this,0, intent, 0); 
LocationUtils.addProximity(this, objPlace.getLat(),objPlace.getLon(), objPlace.getError(), -1,sender); 

还要注意,接近警戒工作有点棘手。

用户根据您设置的信号精度和半径输入热区ZONE1。广播被触发输入= true ZONE1。如果您输入与当前区域重叠的另一个区域ZONE2,则因为您仍在ZONE1中,所以不会收到警报。 您必须离开ZONE1,因此广播会再次输入= false。所以一旦现在你离开ZONE1,如果你到达ZONE2,它将触发输入=真ZONE2的广播。

我测试过了,它工作得很好。从市场免费申请Location Spoofer,并模拟手机的位置。您还需要在手机设置中启用模拟位置。并增加额外的许可应用程序:

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

我会做什么,把我的位置离我很远,大概格陵兰岛,然后设置在触发区域1区的位置,广播应该解雇。然后再次将我的位置设置为Greeland,并设置触发ZONE2的位置,广播应该触发。

进入的标志可以从意向额外

Bundle b = intent.getExtras(); 
Boolean entering = (Boolean) b.get(android.location.LocationManager.KEY_PROXIMITY_ENTERING); 

拿到我用上面的代码设置接近警报100个POI和所有工作。

+1

谢谢@ Pentium10,这个应用程序'位置Spoofer'非常适合测试这个接收器! – hsz 2011-11-29 10:46:34

+0

谢谢,我正在努力测试我的应用程序。这是一个非常好的技术使用位置欺骗 – png 2012-07-31 10:09:43

+0

嗨Pentium10你可以请告诉我怎么可以在我的'服务',已被添加像'intent.setAction(“foo”+ objPlace.getId());'' – 2013-08-20 11:35:40