适用于Android 4.1.1的Galaxy Nexus上的Android Proximity Alerts - 它真的有用吗?

时间:2012-10-02 08:03:26

标签: android alert proximity

我想使用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从Map转换返回带有lat / lon作为int值的GeoPoint。我认为我正确地将它们转换为addProximityAlert预期的双倍值除以1E6
    • 距离中心的距离相对较大 - 1000米 - 我认为这是一个很好的价值。
    • 我在网上找到的示例使用了以编程方式注册的广播接收器。这不是我想要做的。但由Reto Meier撰写的Android 4 Profession Dev一书提到在xml中注册广播接收器也很好。

任何帮助都非常感谢!!

1 个答案:

答案 0 :(得分: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;
}