2010-01-02 3 views
20

J'essaie d'utiliser LocationManager requestLocationUpdates d'Android. Tout fonctionne jusqu'à ce que j'essaie d'extraire l'objet d'emplacement réel dans mon récepteur de diffusion. Ai-je besoin de définir spécifiquement les "extras" à mon intention personnalisée de sorte que l'Android LocationManager avant de le passer à requestLocationUpdates afin qu'il sache comment l'ajouter dans l'intention, ou va-t-il créer le extras-bundle indépendamment du passage intention au récepteur de diffusion?Android: Comment obtenir des informations de localisation à partir de suppléments de forfait d'intention lors de l'utilisation de LocationManager.requestLocationUpdates()

Mon code ressemble à ceci:

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

J'ai un récepteur de radiodiffusion qui est défini dans le manifeste comme:

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

Et la classe de récepteur de radiodiffusion comme:

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

Mon objet "loc" arrive à zéro.

+0

rappelez-vous de NULL CHECK - pas tous ces intentions contiennent des objets 'Location' –

Répondre

20

OK, j'ai réussi à le corriger en modifiant le KEY_LOCATION_CHANGED dans le code de récepteur de radiodiffusion à:

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

j'ai essayé de coder et tester la solution que vous proposez, depuis que je suis confronté à des problèmes similaires concernant les alertes de proximité et des intentions portant des objets de localisation. Selon les informations que vous avez fournies, vous avez réussi à surmonter la récupération d'objet nul, du côté de BroadcastReceiver. Ce que vous n'avez peut-être pas observé, c'est que vous devriez maintenant recevoir le même emplacement que celui dans lequel votre intention a été créée (voir aussi: problème de mise en cache d'intention). Afin de surmonter ce problème, j'ai utilisé FLAG_CANCEL_CURRENT, comme proposé par beaucoup de gens ici et cela marche très bien, en récupérant des valeurs d'emplacement fraîches (et juteuses: P). Ainsi, la ligne définissant votre intention dans l'attente devrait ressembler à ceci:

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

Cependant, vous pouvez ignorer cela si:

  • votre but était juste de recevoir une valeur d'emplacement une fois
  • vous avez réussi à surmonter d'une autre manière pas visible dans votre message
+0

Man, vous avez sauvé ma journée. :RÉ – Davita

Questions connexes