route - Android: cómo obtener información de ubicación de los paquetes de intent extras cuando se usa LocationManager.requestLocationUpdates()
intent filter verification service android (2)
Estoy intentando utilizar el LocationManager de Android requestLocationUpdates. Todo funciona hasta que intento extraer el objeto de ubicación real que está en mi receptor de difusión. ¿Debo definir específicamente los "extras" a mi intención personalizada para que el LocationManager de Android antes de pasarlo a requestLocationUpdates para que sepa cómo agregarlo a la intención, o creará el paquete de extras independientemente de cuándo pase el encendido intención para el receptor de difusión?
Mi código se ve así:
Intent intent = new Intent("com.myapp.swarm.LOCATION_READY");
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, 0);
//Register for broadcast intents
int minTime = 5000;
int minDistance = 0;
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime,
minDistance, pendingIntent);
Tengo un receptor de difusión que se define en el manifiesto como:
<receiver android:name=".LocationReceiver">
<intent-filter>
<action android:name="com.myapp.swarm.LOCATION_READY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Y la clase de receptor de difusión como:
public class LocationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Do this when the system sends the intent
Bundle b = intent.getExtras();
Location loc = (Location)b.get("KEY_LOCATION_CHANGED");
Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show();
}
}
Mi objeto "loc" está subiendo nulo.
He intentado codificar y probar la solución que usted propuso, ya que estoy enfrentando problemas similares relacionados con las alertas de proximidad e intentos de portar objetos de ubicación. Según la información que proporcionó, logró superar la recuperación de objetos nulos, en el lado de BroadcastReceiver. Lo que quizás no observó es que ahora debería estar recibiendo la misma ubicación que la que se creó originalmente (también se lo ve como: intento de caché).
Para superar este problema, utilicé FLAG_CANCEL_CURRENT, como lo proponen muchas personas aquí y funciona bastante bien, obteniendo valores de ubicación frescos (y jugosos: P). Entonces, la línea que define tu intención pendiente debería verse así:
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Sin embargo, puedes ignorar esto si:
- tu propósito era solo recibir un valor de ubicación una vez
- lograste superarlo de alguna otra manera no visible en tu publicación
OK, logré solucionarlo cambiando KEY_LOCATION_CHANGED en el código del receptor de difusión a:
public class LocationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Do this when the system sends the intent
Bundle b = intent.getExtras();
Location loc = (Location)b.get(android.location.LocationManager.KEY_LOCATION_CHANGED);
Toast.makeText(context, loc.toString(), Toast.LENGTH_SHORT).show();
}
}