3 Stimmen

Broadcast-Empfänger onReceive() wird nie aufgerufen - Android

Ich habe das Senden und Empfangen von Broadcasts in meiner Anwendung getestet, aber ich habe ein Problem. Der Dienst startet und ich bekomme den Toast zu sagen, dass die Sendung gesendet wurde, aber onReceive wird nie in der myMapView-Klasse aufgerufen. Ich habe nur den Code, den ich denke, ist relevant unten enthalten... jede Hilfe wäre sehr geschätzt werden. Ich glaube, ich registriere den Empfänger nicht richtig.

Vielen Dank im Voraus.

public class myLocationService extends Service implements LocationListener {
    private static final String GEO_LNG = "GEO_LNG";
    private static final String GEO_LAT = "GEO_LAT";

    private void updateWithNewLocation(Location location){

    if (location != null){

            Double geoLat = location.getLatitude() * 1E6;
            Double geoLng = location.getLongitude() * 1E6;

            Intent intent = new Intent(this, myMapView.class);
            intent.putExtra(GEO_LNG,geoLng);
            intent.putExtra(GEO_LAT, geoLat);
            sendBroadcast(intent);
            Toast.makeText(myLocationService.this, "Broadcast sent", Toast.LENGTH_SHORT).show();
        }   
    else{
        Toast.makeText(myLocationService.this, "Location = null", Toast.LENGTH_SHORT).show();
    }

}
}

public class myMapView extends MapActivity{
    private static final String GEO_LNG = "GEO_LNG";
    private static final String GEO_LAT = "GEO_LAT";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);     

    IntentFilter filter = new IntentFilter();
    filter.addAction(GEO_LONG);
    filter.addAction(GEO_LAT);
    registerReceiver(locationRec, filter);

    Intent i = new Intent(this, myLocationService.class);

            startService(i);
}

    private BroadcastReceiver locationRec = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
                       double geoLng = intent.getExtras().getDouble(GEO_LONG);
                       double geoLat = intent.getExtras().getDouble(GEO_LAT);
            Toast.makeText(GeoTrailsMap.this, "Got broadcast", Toast.LENGTH_LONG).show();

        }
    };

bearbeiten Ich habe meinen Code so geändert, dass er wie folgt aussieht, aber ich habe immer noch kein Glück mit dem Empfang der Sendungen.

public class myLocationService extends Service implements LocationListener {
private static final String GEO_LNG = "GEO_LNG";
private static final String GEO_LAT = "GEO_LAT";
public static final String LOCATION_UPDATE = "LOCATION_UPDATE";

private void updateWithNewLocation(Location location){

if (location != null){

        Double geoLat = location.getLatitude() * 1E6;
        Double geoLng = location.getLongitude() * 1E6;

        Intent intent = new Intent(this, myMapView.class);
        intent.putExtra(GEO_LNG,geoLng);
        intent.putExtra(GEO_LAT, geoLat);
        intent.setAction(LOCATION_UPDATE);
        sendBroadcast(intent);
        Toast.makeText(myLocationService.this, "Broadcast sent",    Toast.LENGTH_SHORT).show();
    }   
    else{
    Toast.makeText(myLocationService.this, "Location = null", Toast.LENGTH_SHORT).show();
    }

}
}

public class myMapView extends MapActivity{
private static final String GEO_LNG = "GEO_LNG";
private static final String GEO_LAT = "GEO_LAT";
private static final String LOCATION_UPDATE = myLocationService.LOCATION_UPDATE;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_layout);     

    IntentFilter filter = new IntentFilter();
    filter.addAction(LOCATION_UPDATE);
    registerReceiver(locationRec, filter);

    Intent i = new Intent(this, myLocationService.class);

    startService(i);
}

private BroadcastReceiver locationRec = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
                   double geoLng = intent.getExtras().getDouble(GEO_LNG);
                   double geoLat = intent.getExtras().getDouble(GEO_LAT);
        Toast.makeText(GeoTrailsMap.this, "Got broadcast", Toast.LENGTH_LONG).show();

    }
};

3voto

Alexander Lucas Punkte 21761

Der auslösende Vorsatz hat keinen Aktionssatz. Wenn Sie "addAction" im IntentFilter hier aufrufen:

    IntentFilter filter = new IntentFilter();
    filter.addAction(GEO_LNG);
    filter.addAction(GEO_LAT);
    registerReceiver(locationRec, filter);

Sie fügen Aktionen hinzu, auf die der Empfänger hören wird (in diesem Fall wird der Empfänger auf GEO_LNG und GEO_LAT hören.

In dem Dienst, in dem Sie die Absicht auslösen, muss die Absicht diese Aktion enthalten, damit der Empfänger sie erkennen kann. Entscheiden Sie, welche Aktion Sie senden möchten, und ändern Sie dann den Code für das Auslösen des Intent so, dass er wie folgt aussieht:

        Intent intent = new Intent(this, myMapView.class);
        // Here you're using GEO_LNG as both the Intent action, and a label 
        // for data being passed over.  Might want to change that for clarity?
        intent.putExtra(GEO_LNG, geoLng);
        intent.putExtra(GEO_LAT, geoLat);
        intent.setAction(GEO_LNG);
        ...

0voto

jclova Punkte 5216

AndroidManifest.xml sollte enthalten:

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

Versuchen Sie es stattdessen mit einem Rundfunkempfänger:

    private LocationManager locationManager;
    private GeoUpdateHandler geoUpdateHandler;

    public void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            geoUpdateHandler = new GeoUpdateHandler();
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                    0, geoUpdateHandler);
}

public void onStop()
    {
        locationManager.removeUpdates(geoUpdateHandler);
        super.onStop();

    }

public class GeoUpdateHandler implements LocationListener {

        private boolean _bLocationChangeReceived = false;

        public void onLocationChanged(Location location) {
            int lat = (int) (location.getLatitude() * 1E6);
            int lng = (int) (location.getLongitude() * 1E6);
            GeoPoint point = new GeoPoint(lat, lng);
            if(!_bLocationChangeReceived)
            {
            mapController.animateTo(point); //  mapController.setCenter(point);
            _bLocationChangeReceived = true;
            }
            OverlayItem overlayitem = new OverlayItem(point, "Testing", "My location!");
            itemizedoverlay.resetOverlay(overlayitem, 0);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X