addProximityAlert和BroadcastReceivers

时间:2012-05-05 00:07:53

标签: android

我目前正在制作一个内置了兴趣点的地图应用。 应该通过接近警报触发器向用户宣布这些点。 这是我正在使用的addproximityAlert()代码

loc.addProximityAlert(lat, longe, radius, -1, PendingIntent.getActivity(
            c, 0, new Intent().putExtra(loc_name, loc_name), flag));

这个想法是,一旦警报触发警告对话框弹出一个关于网站的简短模糊,可以选择关闭警报或获取更多信息(使用WebView)。

到目前为止,我没有运行时或编译时错误,但当我接近每个站点时,没有任何反应。

关于为什么没有发生任何事情的理论是:

1)我没有正确使用PendingIntent,或

2)我没有正确设置BroadcastReceiver

这是BroadcastRecevier的XML代码,

<receiver android:name=".ProxyAlertReceiver" >
        <intent-filter>
            <action android:name="entering" />
        </intent-filter>
    </receiver>

我目前解决此问题的计划是修改PendingIntent以使用这样的新Intent;

...new Intent(myContext, ProxyAlertReceiver.class)...

看看我是否得到任何结果。

对我的问题的意见和建议将不胜感激!

3 个答案:

答案 0 :(得分:2)

您是否尝试过PendingIntent.getBroadcast(...)?

Intent locationReachedIntent = new Intent("entering");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1234, 
    locationReachedIntent, 0);

locationManager.addProximityAlert(longitude, latitude, radius, -1, pendingIntent);

我在我的应用程序中使用了上述代码。

答案 1 :(得分:1)

使用此

Intent locationIntent = new Intent();
Bundle extras= new Bundle();
extras.putString("loc_name",loc_name);
locationIntent.putExtras(extras);
PendingIntent pendingIntent= new PendingIntent.getActivity(this,0,locationIntent,0);
loc.addProximityAlert(lat, longe, radius, -1, pendingIntent, flag));

我假设你的loc_name是一个字符串。这将有效。

答案 2 :(得分:0)

实施接近度提醒不仅取决于在addProximity上调用Location Manager方法。

您还必须:

  1. 创建一个接收器类,当触发警报时将触发该接收器类并将接收状态(进入或退出)和action name *;

    public class ProximityReceiver extends BroadcastReceiver {
     public String TAG ="ProxReceiver";
    
     @Override
     public void onReceive(Context context, Intent intent) {
        /* your code here - sample below */
        final String key = LocationManager.KEY_PROXIMITY_ENTERING;
        final Boolean entering = intent.getBooleanExtra(key, false);
        if (entering) {
          Toast.makeText(context, "LocationReminderReceiver entering", Toast.LENGTH_SHORT).show();
          Log.v(TAG, "Poi entering");
        } else {
          Toast.makeText(context, "LocationReminderReceiver exiting", Toast.LENGTH_SHORT).show();
          Log.v(TAG, "Poi exiting");
        }
        Log.v(TAG,"Poi receive intent["+intent.toString()+"]");
    
        Bundle extras = intent.getExtras();
        // debugging only
        int counterExtras = extras.size();
        if (extras != null) {
          for (String key : extras.keySet()) {
            Object value = extras.get(key);
            Log.d(TAG, "Prox Poi extra "+String.format("key[%s] value[%s] class[%s] count[%s]", key,
                    value.toString(), value.getClass().getName(), String.valueOf(counterExtras)));
          }
        } else {
          Log.v(TAG, "Prox Poi extra empty");
        }
     }
    }
    
  2. 在Manifest文件中声明此接收器;

    <receiver android:name=".ProximityReceiver" >
        <intent-filter>
            <action android:name="my" />
        </intent-filter>
    </receiver>
    
  3. 注册(将您的待处理意图关联到)此接收器,添加接近警报。只在代码中注册接收器ONCE。如果多次注册一个接收器,它将为每个接收器实例触发一次(你到达一个POI,它注册一个名为"my"的未决意图。**

    // create proximity alert
    Intent locationIntent = new Intent("my");
    ProximityReceiver proximityReceiver = new ProximityReceiver();
    PendingIntent pendingIntent = PendingIntent.getBroadcast(mapView.getContext(), <some identifying text>,
            locationIntent, 0);
    loc.addProximityAlert(lat, longe, radius, -1, PendingIntent.getActivity(
        c, 0, new Intent().putExtra(loc_name, loc_name), flag));
    
    IntentFilter filter = new IntentFilter("my");
    context.registerReceiver(proximityReceiver, filter);
    
  4. 如果context在同一活动中运行,则this可以是onPause

    除非您希望即使在后台(甚至已终止)时仍继续接收警报,否则您必须在onResume"my"方法中实施移除和重新创建邻近警报,例如{{ 3}}(跳到问题的末尾)。

    note *在此示例中,Intent将是操作的操作名称(请参阅entering声明),并将与意图和一系列附加内容一起传递,其中包含至少包含键LocationManager.KEY_PROXIMITY_ENTERING"my"),带有布尔值,如果进入(1)或退出(0)接近半径,则为您提供警报的状态。

    note **如果您已多次为"my"注册接收方,则会为每个调用名为{{1}}的意图的邻近警报事件触发多次。