Pregunta

i he estado enfrentando algunos problemas al tratar de pasar los datos a través de las intenciones y las intenciones pendientes a un BroadcastReceiver, relativas a la alerta de proximidad. Más específicamente, la que intenta pasar un objeto, que entre otros tiene posición constantemente cambiante del usuario. Yo he intentado que se proponen diversas tácticas aquí (y no sólo), pero ninguno funcionó, lo que resulta a cualquiera de los valores nulos o iguales-por primera vez creadas las intenciones, cuando la intención es recuperado en el lado del BroadcastReceiver. Tácticas utilizadas:

  • Cómo marcar la intención que lleva el objeto con: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP Resultados: Los valores nulos en el lado del BroadacastReceiver
  • marcar el pendiente intención creado usando la intención inicial, con: FLAG_UPDATE_CURRENT o FLAG_CANCEL_CURRENT Resultados: Los valores nulos en el lado del BroadacastReceiver
  • La adquisición de un ID aleatorio para la intención o la pendiente intención usando System.currentTimeMillis (); Resultado: Intentos no son despedidos o se reciben en absoluto
  • Nada se describe anteriormente. Resultado:. Recuperando el mismo valor inicial cada vez

Código para el método de llamada (despojado de cualquier experimentaciones / producción de valores nulos):

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

Código para el método de llamada que define el filtro de la intención y registros BroadcastReceiver:

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

Código para el lado del 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(){      
 }

}

Cualquier idea sería más que bienvenido. Gracias de antemano.

¿Fue útil?

Solución

Hmm creo que he encontrado algo:

I coloca la BroadcastReceiver (ProximityAlerReceiver), utilizado para detectar alertas de proximidad en la misma clase (MyCarTracking.class), donde se encuentra la LocationListener.class. Esta, proporciona acceso inmediato a las actualizaciones de ubicación frescas, creando un nuevo intento envuelto en un nuevo pendingIntent para ser disparado a la BroadcastReceiver (sólo cuando se cumplen los criterios de proximidad). banderas: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP y FLAG_CANCEL_CURRENT en la intención y pendingIntent, se mantuvieron respectivamente. Más específicamente:

Código de 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
        }
    };

Código de setProximityAlert () Método:

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
}

Esta solución funciona produciendo intentos frescas con las actualizaciones de ubicación frescas. Gracias a todos por su ayuda y su interés:)

Otros consejos

Trate de añadir intent.setData (URI); donde URI es un valor único para cada pendiente de la intención

He estado luchando con este problema también. Me llevó toda una noche para encontrar que un bicho raro que tuve fue relacionado con este tema.

Aquí hay una buena discusión sobre código de Google sobre el tema: http: / /groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921

He resuelto todos mis problemas por (ab) utilizando tanto el URI en SetData y el (reservado) código de solicitud en PendingEvent.GetWhatever.

También estoy usando FLAG_CANCEL_CURRENT en mis intenciones y asegurándose de que sólo pendingintents que comparten el mismo propósito obtener los mismos datos, la acción y la URI.

Esperamos que ayude un poco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top