0

我想使用 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 中注册广播接收器也很好。

非常感谢任何帮助!

4

1 回答 1

0

我遇到了同样的问题。在我的情况下,明确设置意图的目标类有帮助。在您的情况下,它应该如下所示:

private Intent getLocationAlertIntent()
{
    Intent intent = new Intent(context, LocationAlertReceiver.class);
    intent.setAction("com.hybris.proxi.LOCATION_ALERT"); //not sure if this is needed
    intent.putExtra("date", new Date().toString());
    intent.putExtra("name", locationName.getEditableText().toString());
    return intent;
}
于 2013-01-11T12:08:45.873 回答