addProximityAlert和KEY_PROXIMITY_ENTERING

时间:2014-04-27 12:03:45

标签: java android

在文档中,在讨论addProximityAlert时,有关Intent的描述让我感到困惑。特别是这部分..

  

触发的Intent将使用键添加一个布尔额外值   KEY_PROXIMITY_ENTERING。如果值为true,则表示设备正在输入   邻近区域;如果错误,它就会退出。

这可能听起来像一个愚蠢的问题但是......当我进入/或在某个位置的某个半径时,我如何得到真或假。

我不确定这是如何运作的。

我是否必须编写自己的代码并检查我何时在我的位置附近,然后在我退出时让它返回true和false?

我无法理解。

3 个答案:

答案 0 :(得分:6)

我相信这与BroadcastReceiver一起使用。您可以将addProximityAlert()方法设置为在此接收器上触发onReceive()方法,这将为您提供Intent作为参数,然后获取名为{{1}的额外Boolean }}。所以,一步一步:

KEY_PROXIMITY_ENTERING

解释此处设置的参数:

  • your_longitude :您想要计算半径的经度
  • your_latitude :您想要计算半径的纬度
  • RADIUS_IN_METERS :这是您自己定义的常量,您可以在其中指定要从上述参数定义的坐标中追踪的半径长度。如果您将其设置为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公里,否则类似。
  • -1 :这是接近警报停止的时间(以毫秒为单位)。如果设置为onReceive(),则永不过期。
  • proxIntent :触发-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);
}