在文档中,在讨论addProximityAlert
时,有关Intent的描述让我感到困惑。特别是这部分..
触发的Intent将使用键添加一个布尔额外值 KEY_PROXIMITY_ENTERING。如果值为true,则表示设备正在输入 邻近区域;如果错误,它就会退出。
这可能听起来像一个愚蠢的问题但是......当我进入/或在某个位置的某个半径时,我如何得到真或假。
我不确定这是如何运作的。
我是否必须编写自己的代码并检查我何时在我的位置附近,然后在我退出时让它返回true和false?
我无法理解。
答案 0 :(得分:6)
我相信这与BroadcastReceiver
一起使用。您可以将addProximityAlert()
方法设置为在此接收器上触发onReceive()
方法,这将为您提供Intent
作为参数,然后获取名为{{1}的额外Boolean
}}。所以,一步一步:
KEY_PROXIMITY_ENTERING
解释此处设置的参数:
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// You need to declare an Intent for your class and declare a PendingIntent on it,
// so it might be passed to the addProximityAlert method as the fifth parameter.
Intent intent = new Intent("com.yourdomain.yourproject.MyAlert");
PendingIntent proxIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
lm.addProximityAlert(your_latitude, your_longitude, RADIUS_IN_METERS, -1, proxIntent);
,则表示如果有人距离您的坐标不到1公里,那么1000
将为KEY_PROXIMITY_ENTERING
执行true
的距离远远超过1公里,否则类似。onReceive()
,则永不过期。-1
的距离Intent
。此外,您还需要这个:
BroadcastReceiver
这样您就可以为刚设置的过滤器激活Receiver。这将触发IntentFilter filter = new IntentFilter("com.yourdomain.yourproject.MyAlert");
registerReceiver(new AlertOnProximityReceiver(), filter);
事件。现在,只剩下一件事,声明onReceive()
。
BroadcastReceiver
----更新----
我现在在documentation中看到了这一点:
抛出
SecurityException如果不存在ACCESS_FINE_LOCATION权限
因此,请确保在public class AlertOnProximityReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Boolean getting_closer = intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING, false);
if (getting_closer)
Log.d("Radius", "Hey, I just entered your radius!");
else
Log.d("Radius", "I just exited your radius!");
}
}
文件中包含此权限。
答案 1 :(得分:1)
使用addProximityAlert
指定“特殊区域”,该区域应使用其拥有的参数触发近距离警报(粗体)
参数
纬度警报中心点的纬度 地区
经度警报中心点的经度 地区
半径警报区域中心点的半径,in 米到期
此接近警报的时间,以毫秒为单位,或 -1表示没有过期
意图使用PendingIntent,用于在进入或退出警报时生成要触发的Intent 检测到区域
当用户输入您在调用方法时声明的区域时,会调用intent
,在此内部您会发现这个额外的KEY_PROXIMITY_ENTERING
会在您进入或离开此区域时提醒您。
我真的不知道它是如何工作的,但它可能是这样的:
要知道它将检查他是否在半径纬度和纵向,如果是,当他离开时发送意图再次传递“假”。
你的问题的答案无论如何你不应该关心这个事实,它是由系统完成的,你不需要做任何事情。
您唯一需要做的就是阅读此额外内容并在需要时使用它。
来自文档:
由于位置估计的近似性质,如果设备短暂地通过给定区域,则可能不会触发任何意图。类似地,如果设备非常接近给定区域但实际上没有进入,则可以触发Intent。
答案 2 :(得分:0)
使用此代码会对您有所帮助。
Intent intent = new Intent(PROX_ALERT_INTENT);
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
locationManager.addProximityAlert(
lat, // the latitude of the central point of the alert region
lon, // the longitude of the central point of the alert region
POINT_RADIUS, // the radius of the central point of the alert region, in meters
PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration
proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
);
IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
registerReceiver(new ProximityIntentReceiver(orderStatusObject.getBidId()), filter);
类 - 用于近似警报广播
public class ProximityIntentReceiver extends BroadcastReceiver{
private static final int NOTIFICATION_ID = 1000;
public Context mcontext;//Context of calling BroadCast Receiver
private String bidId; //Hold the value of bid Id
public ProximityIntentReceiver() {
// TODO Auto-generated constructor stub
}
public ProximityIntentReceiver(String bidId) {
// TODO Auto-generated constructor stub
this.bidId = bidId;
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String key = LocationManager.KEY_PROXIMITY_ENTERING;
Boolean entering = intent.getBooleanExtra(key, false);
if (entering) {
Log.d(getClass().getSimpleName(), "entering");
}
else {
Log.d(getClass().getSimpleName(), "exiting");
}
sendNotification(context);
}
public void sendNotification(Context mcontext){
// String extra=arg1.getExtras().getString("alert").toString();
long when = System.currentTimeMillis();
String message = "You are near of driver pickup area.";
NotificationManager notificationManager = (NotificationManager) mcontext.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher,message, when);
String title = "Proximity Alert!";
Intent notificationIntent = new Intent();
// set intent so it does not start a new activity
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(mcontext, 0,notificationIntent, 0);
notification.setLatestEventInfo(mcontext, title, message, intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults = Notification.DEFAULT_ALL;
notificationManager.notify(0, notification);
}