位置广播接收器

17

我知道BroadcastReceiver可以监听文本、电话事件等,但是你可以将LocationServices作为服务运行并基于位置信息来触发事件吗?

例如,当你接近某个GPS点时,手机会通知你。


1
请查看以下链接:http://developer.android.com/reference/android/location/LocationListener.html - Nathan Schwermann
2个回答

37

我认为你要找的是这样的东西。有一种 LocationManager.requestLocationUpdates() 的版本,它接受一个PendingIntent参数,这个Intent可以用来触发一个BroadcastReceiver。这段代码将注册一个自定义广播以随位置更新而触发。

Intent intent = new Intent("UNIQUE_BROADCAST_ACTION_STRING_HERE");
LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
long minTime;     //This should probably be fairly long
float minDistance; //This should probably be fairly big
String provider;   //GPS_PROVIDER or NETWORK_PROVIDER

PendingIntent launchIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
manager.requestLocationUpdates(provider, minTime, minDistance, launchIntent);
然后您只需使用相同的Intent操作注册您的BroadcastReceiver,它将接收位置更新以进行处理。 当然,保留该PendingIntent,因为您需要在某个时刻调用manager.removeUpdates(launchIntent)!
最后说明:
因为听起来您正在尝试在应用程序不在前台运行时实现常规位置更新,请记住这一点。 除非您希望您的应用程序被标记为电池耗尽者,否则请务必小心地实现此功能。
您将希望大大减少位置更新的频率,采用较大的minTime或minDistance参数,以使位置服务得到休息。 这个功能也应该附加到用户控制的首选项上,以便他们可以启用/禁用您的应用程序在后台跟踪位置。
希望能对您有所帮助!

@Wireless-Designs,你真是个宝石,我以为是这样的,我还在学习Droid的INTENT,你的回复非常有启发性 - 感谢您的时间,先生! - ProNeticas
没问题。如果这个答案解决了你的问题,请放心接受它。干杯! - devunwired
我会的,我想先进行测试 ;) - ProNeticas
谢谢。我之前一直尝试使用服务和警报管理器,但都没有成功。这正是我一直在寻找的。 - AaronSzy

22

那么你认为这个怎么实现呢?为用户的当前位置设置一个50米半径的地理围栏,然后在退出事件中,设置一个新的具有相同半径的地理围栏,以此来跟踪用户的移动? - Pierre
@Pierre:如果您想根据位置更改进行更新,请查看 https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest.html#setSmallestDisplacement(float)。 - serv-inc
1
感谢@serv-inc,我已经使用了完全相同的方法。为了节省电池电量,我只记录精度低于40米的位置,并添加了一个名为previous location的静态变量,如果新位置距离上一个位置超过40米,我就会记录它,否则不记录。 - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接