1

我目前正在开发一个内置兴趣点的地图应用程序。这些点应该通过接近警报触发器通知给用户。这是我正在使用的 addproximityAlert() 代码

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

这个想法是,一旦警报触发,就会弹出一个警报对话框,其中包含有关该站点的简短说明,可选择关闭警报或获取更多信息(使用 WebView)。

到目前为止,我没有运行时或编译时错误,但是当我接近每个站点时,什么都没有发生。

我关于为什么什么都没有发生的理论是这样的;

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

2)我没有正确设置广播接收器

这是广播接收器的 XML 代码,

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

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

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

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

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

4

3 回答 3

3

你试过 PendingIntent.getBroadcast(...) 吗?

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

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

我的应用程序中有上述代码。

于 2012-06-09T16:46:21.363 回答
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 是一个字符串。这将起作用。

于 2012-08-06T17:05:48.367 回答
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. 在您的清单文件中声明此接收器;

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

如果在相同的活动中运行,context可以在哪里。this

除非您想在后台(甚至终止)时继续接收警报,否则您必须在您的onPauseonResume方法中实现接近警报的删除和重新创建,例如这个 SO 问题(跳到问题的末尾)。

注意 * 在这个例子中,"my"将是一个动作的动作名称(见Intent声明),并将与意图和一组额外内容一起传递,其中至少包含具有布尔值的键entering( ),它为您提供状态LocationManager.KEY_PROXIMITY_ENTERING警报,如果一个人正在进入 (1) 或退出 (0) 接近半径。

注意 ** 如果您已多次注册接收器"my",它将为每个调用名为 的意图的接近警报事件触发多次"my"

于 2017-08-18T09:03:28.183 回答