2010-01-02 20 views
20

Estoy tratando de usar 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?Android: Cómo obtener información de ubicación de los paquetes de intent extras cuando utilizo LocationManager.requestLocationUpdates()

Mi código es el siguiente:

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); 

que tienen un receptor de radiodifusió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 receptor de radiodifusió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.

+0

recuerde NULL CHECK - no todas estas intenciones contienen objetos 'Location' –

Respuesta

20

OK, he conseguido solucionarlo cambiando el KEY_LOCATION_CHANGED en el código receptor de radiodifusió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(); 
    } 
} 
14

i he tratado de código y probar la solución que usted propuso, ya que estoy frente a problemas similares en relación con alertas de proximidad e intenta llevar 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 solucionar 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). Por lo que la línea que define su intención pendientes debe tener este aspecto:

PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
    0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

Sin embargo, puede ignorar esto si:

  • su propósito era sólo para recibir un valor de ubicación una vez
  • se las arregló para superar de alguna otra forma no visible en su publicación
+0

Hombre, me salvó el día. :RE – Davita

Cuestiones relacionadas