2010-07-21 17 views
3

créer une alerte de proximité de cette façonset 2 alertes de proximité avec la même émission

private void setProximityAlert(float radius, double lat, double lng, String place) 
{ 
    long expiration = -1; 
    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Intent intent = new Intent(TREASURE_PROXIMITY_ALERT); 
    intent.putExtra("lat", lat); 
    intent.putExtra("lng", lng); 
    intent.putExtra("place", place); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), -1, intent, 0); 
    locManager.addProximityAlert(lat, lng, radius, expiration, pendingIntent); 
} 

et mon activité je me suis inscrit le récepteur de cette manière

IntentFilter intentFilter = new IntentFilter(TREASURE_PROXIMITY_ALERT); 
    registerReceiver(new ProximityIntentReceiver(), intentFilter); 
    setProximityAlert(10, 45.150344, 9.999815, "POINT1"); 

et mon récepteur de radiodiffusion est correctement appelé. Alors maintenant, je veux ajouter une autre alerte de proximité, est-ce possible? Je veux que le même récepteur boadcast soit appelé par 2 alerte de proximité. Je l'ai fait:

IntentFilter intentFilter1 = new IntentFilter(TREASURE_PROXIMITY_ALERT1); 
    registerReceiver(new ProximityIntentReceiver(), intentFilter1);   
    setProximityAlert(200f, 45.143848, 10.039741, "POINT2"); 

mais il ne fonctionne pas, rien ne se passe. Je suis vraiment maintenant dessus et je me demandais si c'est la bonne façon. Mon intention est de déclencher 2 alertes, une lorsque GPS obtenir la position POINT1 et un autre à la position POINT2. Toutes les aides sont les bienvenues.

Répondre

6

Vous devez utiliser le setAction unique pour que le système considère les deux intentions différentes, sinon il aura tendance à réutiliser le premier.

Je possède ce code:

Intent intent = new Intent(this,PlacesProximityHandlerService.class); 
intent.setAction("foo"+objPlace.getId()); 
intent.putExtra(Poi._ID, objPlace.getId()); 
intent.putExtra(Poi.LAT, objPlace.getLat()); 
intent.putExtra(Poi.LON, objPlace.getLon()); 
PendingIntent sender = PendingIntent.getService(this,0, intent, 0); 
LocationUtils.addProximity(this, objPlace.getLat(),objPlace.getLon(), objPlace.getError(), -1,sender); 

Notez également que l'alerte de proximité fonctionne un peu délicat.

L'utilisateur saisit la ZONE1 à chaud en fonction de la précision du signal et du rayon que vous avez définis. La diffusion est déclenchée pour entrer = true ZONE1. Si vous entrez une autre zone ZONE2 qui chevauche la zone actuelle, vous ne recevez pas l'alerte car vous êtes toujours dans ZONE1. Vous devez quitter la ZONE1, de sorte que l'émission se déclenche à nouveau avec enter = false. Alors une fois que vous avez quitté ZONE1, si vous arrivez sur ZONE2, l'émission sera lancée = true ZONE2.

J'ai testé et ça marche très bien. Grab Location Spoofer application gratuite du marché et se moquent de l'emplacement du téléphone. Vous devez également activer les emplacements fictifs dans les paramètres du téléphone. Et ajouter une autorisation supplémentaire à votre application:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 

Ce que je ferais, régler ma position loin de moi, sans doute du Groenland, puis régler la position dans une zone qui déclenche ZONE1, la diffusion devrait tirer. Redéfinissez ensuite ma position sur Greeland et réglez la position qui déclenche ZONE2, la diffusion devrait se déclencher.

Le drapeau entrant peut être obtenir des extras intention

Bundle b = intent.getExtras(); 
Boolean entering = (Boolean) b.get(android.location.LocationManager.KEY_PROXIMITY_ENTERING); 

je les codes ci-dessus aux alertes de proximité de configuration pour 100 points d'intérêt et tout fonctionne bien.

+1

Merci @ Pentium10, cette application 'Location Spoofer' est idéale pour tester ces récepteurs! – hsz

+0

Merci, je trouvais difficile de tester mon application. Ceci est une très bonne technique pour utiliser spoofer emplacement – png

+0

Salut Pentium10 pouvez-vous dire s'il vous plaît comment puis-je utiliser la valeur dans mon 'Service' qui a été ajouté comme' intention.setAction ("foo" + objPlace.getId()); ' –