2010-01-02 14 views
20

Sto tentando di utilizzare LocationManager di Android RequestLocationUpdates. Tutto funziona fino a quando non cerco di estrarre l'oggetto posizione attuale nel mio ricevitore broadcast. Devo definire in modo specifico gli "extra" al mio intento personalizzato in modo che il LocationManager di Android prima di passarlo a requestLocationUpdates in modo che sappia come aggiungerlo nell'intento, o creerà il bundle extra indipendentemente da quando passa il licenziamento intento al destinatario della trasmissione?Android: come ottenere informazioni sulla posizione dagli extra del pacchetto di intenti quando si utilizza LocationManager.requestLocationUpdates()

Il mio codice simile a questo:

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

Ho un ricevitore di broadcast che è definito nel manifesto come:

<receiver android:name=".LocationReceiver"> 
    <intent-filter> 
     <action android:name="com.myapp.swarm.LOCATION_READY" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

E la classe ricevitore broadcast:

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

Il mio oggetto "loc" sta arrivando a zero.

+0

ricordarsi di NULL CHECK - non tutti questi intenti contengono oggetti 'Location' –

risposta

20

OK, sono riuscito a risolvere il problema cambiando la KEY_LOCATION_CHANGED nel codice del ricevitore broadcast:

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

Io ho cercato di codice e provare la soluzione avete proposto, dal momento che sto affrontando problemi simili relativi avvisi di prossimità e gli intenti che trasportano oggetti di posizione. Secondo le informazioni che hai fornito, sei riuscito a superare il recupero di oggetti nulli, sul lato di BroadcastReceiver. Quello che potresti non osservare è che ora dovresti ricevere la stessa posizione di quella che il tuo intento è stato creato (anche visto come: problema di caching degli intenti).

Per superare questo problema, ho utilizzato FLAG_CANCEL_CURRENT, come proposto da molte persone qui e funziona piuttosto bene, recuperando i valori di posizione freschi (e succosi: P). Così la linea che definisce il vostro intento in attesa dovrebbe essere simile a questo:

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

Tuttavia, è possibile ignorare questo se:

  • il vostro scopo era solo quello di ricevere un valore posizione una volta
  • sei riuscito a superare in qualche altro modo non visibile nel tuo post
+0

Man, hai salvato la mia giornata. : D – Davita

Problemi correlati