我想使用 Android 的 LocationManager 和 addProximityAlert 方法来设置接近警报。为此,我创建了一个小型应用程序,该应用程序在地图顶部显示十字准线,以及用于接近警报名称的文本字段和用于触发添加警报的按钮。
不幸的是,应该接收接近警报的 BroadcastReceiver 没有被触发。我已经单独测试了意图(没有通过 PendingIntent 包装)并且有效。此外,我看到一旦设置了接近警报,GPS / 位置图标就会出现在通知栏中。
我发现有关接近警报的信息有点令人困惑 - 有些人告诉如果活动不再处于前台,则无法使用警报。我认为它应该有效,所以我认为还有其他问题。
1 添加接近警报
GeoPoint geo = mapView.getMapCenter();
Toast.makeText(this, geo.toString(), Toast.LENGTH_LONG).show();
Log.d("demo", "Current center location is: " + geo);
PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, getLocationAlertIntent(), 0);
locationManager.addProximityAlert(geo.getLatitudeE6()/1E6, geo.getLongitudeE6()/1E6, 1000f, 8*60*60*1000, pIntent);
意图本身在这里:
private Intent getLocationAlertIntent()
{
Intent intent = new Intent("com.hybris.proxi.LOCATION_ALERT");
intent.putExtra("date", new Date().toString());
intent.putExtra("name", locationName.getEditableText().toString());
return intent;
}
我创建了一个接收器,它应该接收位置警报,在 AndroidManifest.xml 中注册:
<receiver android:name=".LocationAlertReceiver">
<intent-filter>
<action android:name="com.hybris.proxi.LOCATION_ALERT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
希望实现本身很简单。它应该显示一个通知(我通过直接发送带有测试按钮的意图进行了检查)。
public class LocationAlertReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent intent) {
Log.d("demo", "Received Intent!");
String dateString = intent.getStringExtra("date");
String locationName = intent.getStringExtra("name");
boolean isEntering = intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(ctx)
.setContentTitle("LocAlert: " + locationName)
.setContentText(dateString + "|enter: " + isEntering)
.setSmallIcon(R.drawable.ic_stat_loc_notification)
.build();
notificationManager.notify(randomInteger(), notification);
}
private int randomInteger()
{
Random rand = new Random(System.currentTimeMillis());
return rand.nextInt(1000);
}
一些我不能 100% 确定的事情,也许这会触发你的某些事情:
- 我认为可以像我一样使用挂起的意图注册接近警报,并且稍后可以关闭创建接近警报的活动。
- 通过 getCenter 从地图转换返回一个带有 lat/lon 作为 int 值的 GeoPoint。我认为我通过除以 1E6 正确地将它们转换为 addProximityAlert 预期的双精度值
- 距中心的距离相对较大 - 1000m - 我认为这是一个不错的值。
- 我在网上找到的示例使用了以编程方式注册的广播接收器。这不是我想做的。但是 Reto Meier 的 Android 4 Profession Dev 一书提到在 xml 中注册广播接收器也很好。
非常感谢任何帮助!