addProximityAlert nie działa zgodnie z oczekiwaniami
ios sdk ma świetne funkcje monitorowania regionu. Potrzebuję czegoś takiego w Androidzie i myślę, że mamy dwie możliwości. Geofencing i LocationManager.
Geofencing ma naprawdę uporządkowane przykłady i błędy, więc preferowałem LocationManager. Everyting działa poprawnie w LocationManager z wyjątkiem jednego. Jeśli dodasz swoją aktualną lokalizację jako ProximityAlert, natychmiast wywoła ona „ENTERING”, ale jest to moja aktualna lokalizacja, nie oznacza to, że wszedłem do tego regionu. Z tego powodu uruchamia „WPROWADZANIE” za każdym razem, gdy uruchamiam aplikację, jeśli jestem w regionie (nawet jeśli się nie ruszam)
Jak mogę rozwiązać ten problem i pożar, tylko jeśli użytkownik naprawdę WPROWADZA region?
Oto, w jaki sposób dodaję PeddingIntents dla moich lokalizacji.
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);
}
Odbiorca
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");
}
}
Oczywisty
<receiver android:name=".ProximityReceiver">
<intent-filter>
<action android:name="ACTION_PROXIMITY_ALERT" />
</intent-filter>
</receiver>
Dziękuję Ci bardzo
PS: iOS nie ma tego problemu, a ich dokumentacja to wyjaśnia
Monitorowanie regionu geograficznego rozpoczyna się natychmiast po zarejestrowaniu autoryzowanych aplikacji. Nie oczekuj jednak, że od razu otrzymasz wydarzenie. Tylko przejścia graniczne generują zdarzenie. Jeśli więc w czasie rejestracji lokalizacja użytkownika znajduje się już w regionie, menedżer lokalizacji nie generuje automatycznie zdarzenia. Zamiast tego aplikacja musi czekać, aż użytkownik przekroczy granicę regionu, zanim wydarzenie zostanie wygenerowane i wysłane do delegata. Można jednak użyć metody requestStateForRegion: klasy CLLocationManager, aby sprawdzić, czy użytkownik znajduje się już w granicach regionu.