addProximityAlert não funciona como esperado
O ios SDK tem ótimas funções de monitoramento de região. Eu preciso de algo assim no android e acho que temos duas alternativas. Geofencing e LocationManager.
O Geofencing tem exemplos e bugs realmente arrumados, então eu preferi o LocationManager. Everyting funciona bem no LocationManager, exceto um. Se você adicionar sua localização atual como ProximityAlert, ela imediatamente dispara "ENTERING", mas é minha localização atual, não significa que eu entrei nesta região. Por causa disso, ele dispara "ENTERING" toda vez que eu inicio meu aplicativo, se eu estiver na região. (Mesmo que eu não esteja me movendo)
Como posso resolver este problema e disparar o evento somente se o usuário estiver realmente entrando na região?
Aqui está como eu estou adicionando PeddingIntents para meus locais.
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);
}
Receptor
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");
}
}
Manifesto
<receiver android:name=".ProximityReceiver">
<intent-filter>
<action android:name="ACTION_PROXIMITY_ALERT" />
</intent-filter>
</receiver>
Muito obrigado
PS: iOS não tem esse problema e sua documentação explica isso
O monitoramento de uma região geográfica começa imediatamente após o registro de aplicativos autorizados. No entanto, não espere receber um evento imediatamente. Somente cruzamentos de limite geram um evento. Assim, se no momento do registro a localização do usuário já estiver dentro da região, o gerenciador de localização não gerará automaticamente um evento. Em vez disso, seu aplicativo deve aguardar o usuário cruzar o limite da região antes que um evento seja gerado e enviado para o delegado. Dito isso, você pode usar o método requestStateForRegion: da classe CLLocationManager para verificar se o usuário já está dentro do limite de uma região.