ios sdk имеет отличные функции мониторинга области. Мне нужно что-то подобное в андроиде, и я думаю, у нас есть две альтернативы. Geofencing и LocationManager.addProximityAlert не работает должным образом
Geofencing имеет действительно аккуратные примеры и ошибки, поэтому я предпочитаю LocationManager. Everyting отлично работает в 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");
}
}
Manifest
<receiver android:name=".ProximityReceiver">
<intent-filter>
<action android:name="ACTION_PROXIMITY_ALERT" />
</intent-filter>
</receiver>
Большое спасибо
PS: IOS не имеют этой проблемы, и их документация объясняет это так
Мониторинг географического региона начинается сразу после регистрации для авторизированных приложений. Однако не ожидайте, что вы сразу получите событие. Только пересечения границ генерируют событие. Таким образом, если во время регистрации местоположение пользователя уже находится внутри региона, диспетчер местоположений автоматически не генерирует событие. Вместо этого ваше приложение должно дождаться, когда пользователь пересечет границу региона до того, как событие будет сгенерировано и отправлено делегату. Тем не менее, вы можете использовать метод requestStateForRegion: класса CLLocationManager, чтобы проверить, находится ли пользователь уже на границе области.
Если вы посмотрите на исходный код locationManager.addProximity (..), вы увидите, что этот метод работает с геозонностью. – Harco