我目前正在制作一个内置了兴趣点的地图应用。 应该通过接近警报触发器向用户宣布这些点。 这是我正在使用的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)...
看看我是否得到任何结果。
对我的问题的意见和建议将不胜感激!
答案 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
方法。
您还必须:
创建一个接收器类,当触发警报时将触发该接收器类并将接收状态(进入或退出)和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");
}
}
}
在Manifest文件中声明此接收器;
<receiver android:name=".ProximityReceiver" >
<intent-filter>
<action android:name="my" />
</intent-filter>
</receiver>
注册(将您的待处理意图关联到)此接收器,添加接近警报。只在代码中注册接收器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);
如果context
在同一活动中运行,则this
可以是onPause
。
除非您希望即使在后台(甚至已终止)时仍继续接收警报,否则您必须在onResume
和"my"
方法中实施移除和重新创建邻近警报,例如{{ 3}}(跳到问题的末尾)。
note *在此示例中,Intent
将是操作的操作名称(请参阅entering
声明),并将与意图和一系列附加内容一起传递,其中包含至少包含键LocationManager.KEY_PROXIMITY_ENTERING
("my"
),带有布尔值,如果进入(1)或退出(0)接近半径,则为您提供警报的状态。
note **如果您已多次为"my"
注册接收方,则会为每个调用名为{{1}}的意图的邻近警报事件触发多次。