addProximityAlert не работает должным образом
IOS SDK имеет отличные функции мониторинга региона. Мне нужно что-то подобное в Android, и я думаю, у нас есть две альтернативы. Геозоны и LocationManager.
Geofencing имеет очень аккуратные примеры и ошибки, поэтому я предпочел LocationManager. Все отлично работает в 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 не имеет этой проблемы, и их документация объясняет это так
Мониторинг географического региона начинается сразу после регистрации авторизованных приложений. Однако не ожидайте получить событие сразу. Только пересечения границ генерируют событие. Таким образом, если во время регистрации местоположение пользователя уже находится внутри региона, менеджер местоположений не генерирует событие автоматически. Вместо этого ваше приложение должно дождаться, пока пользователь пересечет границу региона, прежде чем событие будет сгенерировано и отправлено делегату. Тем не менее, вы можете использовать requestStateForRegion: метод класса CLLocationManager, чтобы проверить, находится ли пользователь уже внутри границы региона.