Question

J'ai été confronté à des problèmes en essayant de transmettre des données à travers les intentions et les intentions en attente d'un BroadcastReceiver, concernant les alertes de proximité. Plus précisément, je essaie de passer un objet, qui entre autres détient la position en constante évolution de l'utilisateur. J'ai essayé diverses tactiques proposées ici (et non seulement), mais aucun travaillé, ce qui soit à des valeurs nulles ou même que, pour la première fois, les intentions créés lorsque le est récupéré du côté de l'BroadcastReceiver intention. Les tactiques utilisées:

  • Signalement l'intention qui transporte l'objet avec: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP Résultat: les valeurs nulles du côté du BroadacastReceiver
  • l'intention Signalement l'attente créée en utilisant l'intention initiale, avec: FLAG_UPDATE_CURRENT ou FLAG_CANCEL_CURRENT Résultat: les valeurs nulles du côté du BroadacastReceiver
  • L'acquisition d'un identifiant aléatoire à l'intention ou l'intention en attente en utilisant System.currentTimeMillis (); Résultat: Intentions ne sont pas déclenchés ou reçus du tout
  • Rien décrit ci-dessus. Résultat:. Récupération de la même valeur initiale chaque fois

code pour le procédé d'appel (dépouillée de toutes les expérimentations / produire des valeurs nulles):

private void setProximityAlert(MyCar myCar) { 
  String locService = Context.LOCATION_SERVICE; 
  LocationManager locationManager; 
  locationManager = (LocationManager)getSystemService(locService);
  float radius = myCar.getMyCarRadius(); 
  long expiration = myCar.getMyCarExpiration(); 
  myService.setMyDriverLat(userLat);//setting user's position
  myService.setMyDriverLng(userLng);//setting user's position
  Intent  intent = new Intent(myCar.getMyCarName());
  intent.putExtra("myCar",myCar);

  PendingIntent proximityIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
  locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);
 }

Code pour la méthode d'appel qui définit le filtre intention et enregistre le BroadcastReceiver:

public void addNewCarPoint (MyCar myCar){
        IntentFilter filter = new IntentFilter(myCar.getMyCarName());
        registerReceiver(new ProximityAlertReceiver(), filter);
        setProximityAlert(myCar);
    }

Code pour le côté du BroadcastReceiver:

public class ProximityAlertReceiver extends BroadcastReceiver {
 @Override
 public void onReceive (Context context, Intent intent) {
 MyCar myCar=(MyCar)intent.getParcelableExtra("myCar");
  driverLoc=(String)Double.toString(myCar.getMyDriverLat());
  Toast.makeText(context, userLoc, Toast.LENGTH_SHORT).show();
  Intent i = new Intent(context, MyCarDiscoveryPrompt.class);
  context.startActivity(i);//firing intent
 }
 public void intentDataLoader(){      
 }

}

Toutes les idées serait plus que bienvenue. Nous vous remercions à l'avance.

Était-ce utile?

La solution

Hmm je pense que j'ai trouvé quelque chose:

Je placé la BroadcastReceiver (ProximityAlerReceiver), utilisé pour détecter des alertes de proximité dans la même classe (MyCarTracking.class), où le LocationListener.class est situé. Cette, offre un accès immédiat à des mises à jour de localisation frais, la création d'une nouvelle intention enveloppée dans une nouvelle pendingIntent à cuire au BroadcastReceiver (uniquement lorsque les critères de proximité sont respectées). drapeaux: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP et FLAG_CANCEL_CURRENT sur l'intention et pendingIntent, ont été maintenus respectivement. Plus précisément:

Code pour LocationListener:

private final LocationListener locationListener = new LocationListener() { 
        public void onLocationChanged(Location location) {
            updateWithNewLocation(location);//update application based on new location
        }
        public void onProviderDisabled(String provider){ 
            updateWithNewLocation(null);//update application if provider disabled
        }
        public void onProviderEnabled(String provider){
            // Update application if provider enabled
        } 
        public void onStatusChanged(String provider, int status, Bundle extras){ 
            //update application if provider hardware status changed
        }
    };

code pour méthode setProximityAlert ():

private void setProximityAlert() { 
    String locService = Context.LOCATION_SERVICE; 
    Context context =getApplicationContext();
    LocationManager locationManager; 
    locationManager = (LocationManager)getSystemService(locService);
    float radius = myCar.getMyCarRadius(); 
    long expiration = myCar.getMyCarExpiration(); 
    Intent  intent = new Intent(CAR_DISCOVERED);
    intent.putExtra("myCar",myCar);
    locationManager.getLastKnownLocation(provider);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//flagging intent
    PendingIntent proximityIntent = PendingIntent.getBroadcast(context, -1, intent, PendingIntent.FLAG_CANCEL_CURRENT);//flagging pendingIntent         
    locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);//setting proximity alert
}

Cette solution fonctionne la production de nouvelles intentions avec des mises à jour de l'emplacement frais. Merci à tous pour votre aide et votre intérêt:)

Autres conseils

Essayez d'ajouter intent.setData (uri); où uri est une valeur unique pour chaque intention en attente

J'ai été aux prises avec ce problème aussi bien. Il m'a fallu toute une nuit pour trouver qu'un bug bizarre j'avais été lié à cette question.

Voici une bonne discussion sur le code de Google sur le sujet: http: / /groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921

Je l'ai résolu tous mes problèmes par (ab) utilisant à la fois la uri SetData et le code de demande (réservé) en PendingEvent.GetWhatever.

J'utilise aussi FLAG_CANCEL_CURRENT sur mes intentions et faire en sorte que pendingintents qui partagent le même but obtenir les mêmes données, l'action et uri.

espère que cela aide un peu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top