4 Stimmen

Problem beim Implementieren des Standortlisteners in der Android-App-Widget

Ich arbeite an einem Widget, das den aktuellen GPS-Standort abruft und diesen Wert an eine entfernte PHP-Seite übergibt, um die Informationen zu erhalten und sie im Widget anzuzeigen. Das ist es, was ich versuche zu tun.

Ich habe Probleme bei der Implementierung des Location Listeners für das AppWidget. Es wird nicht mit dem aktuellen Standort aktualisiert und zeigt das anfängliche Widget an, d.h. "Widget wird geladen" (Hier habe ich diesen Text eingefügt).

Können wir einen Location Listener für AppWidgetProvider implementieren?
Oder
Kannst du mir eine mögliche Lösung vorschlagen, um den GPS-Standort im App Widget zu erhalten?

Ich habe alle erforderlichen Berechtigungen in der Manifestdatei platziert.
Hier ist mein Code-Schnipsel:

`public class test extends AppWidgetProvider { static LocationManager locMan; static Location curLocation; static Boolean locationChanged;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    // Um ANR-Timeouts zu vermeiden, führen wir das Update in einem Service aus
    context.startService(new Intent(context, UpdateService.class));
}

public static class UpdateService extends Service {
    // GPS-Listenerklasse
    LocationListener gpsListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Log.w("GPS", "Gestartet");
            if (curLocation == null) {
                curLocation = location;
                locationChanged = true;
            }

            if (curLocation.getLatitude() == location.getLatitude() && curLocation.getLongitude() == location.getLongitude())
                locationChanged = false;
            else
                locationChanged = true;

            curLocation = location;

            if (locationChanged) 
                locMan.removeUpdates(gpsListener);

        }

        public void onProviderDisabled(String provider) {

        }

        public void onProviderEnabled(String provider) {
            // Log.w("GPS", "Standort geändert", null);
        }

        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            if (status == 0)// Nicht verfügbar
            {

            } else if (status == 1)// Versuche zu verbinden
            {

            } else if (status == 2) {// Verfügbar

            }
        }

    };

    // In der Startmethode des Dienstes melde ich mich für GPS-Updates an
    @Override
    public void onStart(Intent intent, int startId) {

        locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER,20000, 1, gpsListener);
        } else {
            this.startActivity(new Intent("android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS"));
        }

        if (curLocation != null) {
            double lat = curLocation.getLatitude();
            double lng = curLocation.getLongitude();
            Toast.makeText(getBaseContext(),"Breite: " + String.valueOf(lat) + "\n Länge: "+ String.valueOf(lng), Toast.LENGTH_LONG).show();

        }
        // Widget-Update für heute erstellen
        RemoteViews updateViews = buildUpdate(this);

        // Widget-Update für diesen Widget auf dem Startbildschirm auslösen
        ComponentName thisWidget = new ComponentName(this,InKakinadaWidget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);

    }

    public RemoteViews buildUpdate(Context context) {
        // Hier aktualisiere ich die RemoteView
        return updateViews;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Wir müssen uns nicht an diesen Dienst binden
        return null;
    }

}
}` 

Vielen Dank im Voraus...

Mit freundlichen Grüßen, Raghavendra K.

8voto

Bryan Bedard Punkte 2559

Das Problem, das ich sehe, ist, dass du versuchst, curLocation in onStart() zu überprüfen, direkt nachdem du requestLocationUpdates() aufgerufen hast. LocationManager.requestLocationUpdates() ist asynchron, was bedeutet, dass dein LocationListener erst zurückgerufen wird, nachdem onStart() zurückgekehrt ist. Lass deinen LocationListener die UI aktualisieren, nachdem er den Standort erhalten hat, versuche nicht, es in onStart zu tun.

3voto

emmby Punkte 98109

Haben Sie dieses Problem im Emulator oder auf einem Gerät? Wenn es sich um den Emulator handelt, stellen Sie sicher, dass Sie DDMS verwenden, um einen GPS-Standort festzulegen. Aber das Einfachste wäre wahrscheinlich, Ihren Code auf einem Gerät auszuführen, um zu sehen, ob Sie auf diese Weise GPS-Updates erhalten.

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