ios sdk具有出色的区域监控功能。我在android中需要类似的东西,我认为我们有两种选择。 Geofencing和LocationManager。
Geofencing有很整洁的例子和错误,所以我更喜欢LocationManager。 Everytry在LocationManager中工作正常,除了一个。如果你将当前位置添加为ProximityAlert,它立即触发“输入”,但它是我当前的位置,它并不意味着我进入了这个区域。因此,如果我在区域内,每次启动我的应用程序时都会触发“输入”。(即使我没有移动)
如果用户确实正在进入该区域,我该如何解决此问题并触发事件?
以下是我为我的位置添加PeddingIntents的方法。
LocationManager locationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);
for(Place p : places)
{
Log.e("location", p.location);
Bundle extras = new Bundle();
extras.putString("name", p.displayName);
extras.putString("id", p.id);
Intent intent = new Intent(CommandTypes.PROX_ALERT_INTENT);
intent.putExtra(CommandTypes.PROX_ALERT_INTENT, extras);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,Integer.parseInt(p.id), intent,PendingIntent.FLAG_CANCEL_CURRENT);
float radius = 50f;
locationManager.addProximityAlert(p.lat,
p.lon, radius, 1000000, pendingIntent);
}
接收机
public class ProximityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
final String key = LocationManager.KEY_PROXIMITY_ENTERING;
final Boolean entering = intent.getBooleanExtra(key, false);
Bundle b = intent.getBundleExtra(CommandTypes.PROX_ALERT_INTENT);
String id = b.getString("id");
Log.e("here" + id, "here");
if (entering) {
Log.e(TAG,"entering");
} else {
Log.e(TAG,"leaving");
}
}
清单
<receiver android:name=".ProximityReceiver">
<intent-filter>
<action android:name="ACTION_PROXIMITY_ALERT" />
</intent-filter>
</receiver>
非常感谢
PS:iOS没有这个问题,他们的文档解释如此
在注册授权应用程序后立即开始监控地理区域。但是,不要指望立即收到活动。只有边界交叉才会生成事件。因此,如果在注册时用户的位置已经在区域内,则位置管理器不会自动生成事件。相反,您的应用必须等待用户跨越区域边界,然后才能生成事件并将其发送给代理。也就是说,您可以使用CLLocationManager类的requestStateForRegion:方法来检查用户是否已经在区域的边界内。
答案 0 :(得分:3)
编辑:自从我写这篇文章以来,地理围栏API中添加了一个新东西,'setInitialTrigger'可以缓解这个问题:
是的,这是令人讨厌的,不幸的是,这是Android和IOS地理围栏不同的主要原因之一。
如果您知道自己在外面,或者在内部添加了地理围栏,那么当您在Geofence内部时会发出Android警报。我解决这个问题的方法是在我的广播接收器中使用“宽限期”。基本上,当我创建Geofence时,我将其创建时间存储在共享偏好中,并在onReceive中检查该值。
通过这样做,任何“立即”命中都将被过滤掉。对于其他人来说,也许3分钟太长了,但根据我在应用程序中使用地理围栏的方式,它对我有用。
private static final Long MIN_PROXALERT_INTERVAL = 18000l; // 3 mins in milliseconds
...
long geofenceCreationTime = session.getPrefs().getCurrentGeofenceCreation();
long elapsedSinceCreation = now - geofenceCreationTime;
if(elapsedSinceCreation < CREATIONTIME_GRACE_PERIOD){
if (ApplicationSession.DEBUG) {
Log.d(TAG, "elapsedSinceCreation;"+elapsedSinceCreation+";less than;"+CREATIONTIME_GRACE_PERIOD+";exiting");
}
return;
}
希望你能看到我的目标。
希望它有所帮助。