4

J'ai eu quelques problèmes pour essayer de transmettre des données via des intentions et des intentions en attente à un BroadcastReceiver, concernant des alertes de proximité. Plus précisément, j'essaie de passer un objet, qui entre autres tient la position de l'utilisateur en constante évolution. J'ai essayé différentes tactiques proposées ici (et pas seulement), mais aucune n'a fonctionné, résultant en des valeurs nulles ou des intentions créées pour la première fois, lorsque l'intention est récupérée du côté de BroadcastReceiver. Tactiques utilisées:PendingIntents conserve le même objet

  • 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é de la BroadacastReceiver
  • pavillon au but en instance créée en utilisant l'objectif initial, avec: FLAG_UPDATE_CURRENT ou FLAG_CANCEL_CURRENT Résultat: Valeurs Null du côté de BroadacastReceiver
  • Acquisition d'un ID aléatoire pour l'intention ou l'intention en attente à l'aide de System.currentTimeMillis(); Résultat: Les intentions ne sont pas déclenchées ou reçues du tout
  • Rien n'a été décrit ci-dessus. Résultat: Récupérer la même valeur initiale à chaque fois.

code pour le procédé d'appel (débarrassé de toute expérimentation/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 appelante qui définit le filtre d'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é récepteur de la diffusion:

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 seraient plus que bienvenues. Merci d'avance.

Répondre

1

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

J'ai placé le BroadcastReceiver (ProximityAlerReceiver), utilisé pour détecter des alertes de proximité dans la même classe (MyCarTracking.class), où le LocationListener.class est situé. Ceci, fournit un accès immédiat à de nouvelles mises à jour d'emplacement, créant une nouvelle intention enveloppée dans un nouvel pendingIntent à envoyer au BroadcastReceiver (seulement lorsque les critères de proximité sont satisfaits).Les indicateurs : FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP et FLAG_CANCEL_CURRENT sur intention et pendingIntent ont été conservés 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 la 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 :)

0

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

+0

Je l'ai essayé aussi, mais il semble qu'il tombe également dans la troisième tactique décrite ci-dessus, sans intentions d'être tiré ou reçu:/ – nifo

0

J'ai également été confronté à ce problème. Il m'a fallu une nuit entière pour constater qu'un bug bizarre que j'avais était lié à ce problème.

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

J'ai résolu tous mes problèmes en (ab) utilisant à la fois la uri SetData et le code de demande (réservé) à PendingEvent.GetWhatever. J'utilise également FLAG_CANCEL_CURRENT sur mes intentions et je m'assure que seuls les utilisateurs en attente qui partagent le même objectif obtiennent les mêmes données, les mêmes actions et les mêmes uri.

J'espère que ça aide un petit peu.

+0

C'est une discussion intéressante que je J'ai lu aussi, mais il semble que ce soit quelque chose d'autre qui ne va pas ici, puisque j'ai tout essayé ... Merci pour l'info cependant :) – nifo

Questions connexes