web-dev-qa-db-ger.com

GoogleApiClient + LocationServices wird nicht aktualisiert

Ich versuche nur, eine einfache "Tutorial" -App zu erstellen, um den Standort meines Telefons zu ermitteln (um zu lernen, wie ich es später in einer anderen App verwenden kann), aber ich komme einfach nicht weiter.

Was ich getan habe

  1. Android Developer's Tutorial: Zuerst folgte ich dem Tutorial auf der Android-Entwicklerseite (developer.Android.com/training/location/receive-location-updates.html). 

    Wie dort angegeben, habe ich Location, LocationClient und LocationRequest verwendet, um sie in onCreate zu initialisieren (und einzurichten). LocationClient ist in onStart und onStop verbunden und getrennt.

    Ich fordere eine Standortaktualisierung an, nachdem ich verbunden bin (in onConnected). Ich vergewissere mich vor dem Aufruf, dass GooglePlayServices verfügbar ist, und ich bekomme immer noch keine Aktualisierung in "onLocationChanged".

  2. GoogleApiClient: Ich habe festgestellt, dass LocationClient veraltet ist und LocationServices bevorzugt wird (developer.Android.com/reference/com/google/Android/gms/location/LocationClient.html).

    Wie hier angegeben: https://developer.Android.com/reference/com/google/Android/gms/location/FusedLocationProviderApi.html benutze ich einen GoogleApiClient und setze ihn auf LocationServices (auch https://stackoverflow.com/a/25013850/3802589 ). Also habe ich alles festgelegt, um dies zu verwenden, aber ich bekomme keine Updates für den Standort. 

onLocationChanged sollte gedruckt werden, wenn eine Antwort vorliegt. Ich habe auch einen Button gesetzt, der den Ort oder "nichts" druckt.

Bemerkungen

Ich habe mit Google Maps nachgeprüft, ob ich vielleicht etwas ausgeschaltet habe, aber es funktioniert einwandfrei.

Projekt

build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.Android.gms:play-services:5.0.77'
    compile "com.Android.support:support-v4:20.0.+"
}

Manifest

...
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
...
<meta-data Android:name="com.google.Android.gms.version"
            Android:value="@integer/google_play_services_version" />
...

Code

public class MyActivity extends Activity  implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    private GoogleApiClient mLocationClient;
    private Location mCurrentLocation;
    LocationRequest mLocationRequest;

    ...
    /* Constant fields - request interval */
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        mLocationClient = new GoogleApiClient.Builder(getApplicationContext())
                                .addApi(LocationServices.API)
                                .addConnectionCallbacks(this)
                                .addOnConnectionFailedListener(this)
                                 .build();

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);

    }

    @Override
    protected void onStart() {
        super.onStart();
        mLocationClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();

        LocationServices.FusedLocationApi.removeLocationUpdates(mLocationClient, this);

        mLocationClient.disconnect();
    }

    public void onClick(View view) {

        if (mCurrentLocation != null) {
            Log.i("Location", mCurrentLocation.toString());
        } else {
            Log.i("Location", "nothing");
        }

    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d("Location Update", "CHANGED");
        mCurrentLocation = location;
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Display the connection status
        Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
        if(servicesConnected()) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest, this);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        Toast.makeText(this, "Disconnected. Please re-connect.",
                Toast.LENGTH_SHORT).show();
    }

logcat

8948-8948/example.Android.com.test D/Location Updates﹕ Google Play services is available.
8948-8948/example.Android.com.test I/Location﹕ nothing

Ich habe das Gefühl, dass ich etwas wirklich einfaches vergessen könnte ... aber ich kann es einfach nicht sehen und ich habe zu viel Zeit damit verbracht, einen einfachen Ort zu finden ...

Ich könnte vielleicht nur die Android.Location-API verwenden, aber ... Es stört mich, dass dies so schwer ist (angeblich einfacher).

12
TomDT

Der Fehler war nur, dass das WLAN nicht eingeschaltet war ...

Was GregM gesagt hat: Wenn ich richtig liege, ist dies die alte API (die meisten sind momentan veraltet) und wie auf der Entwicklerseite angegeben ( https://developer.Android.com/google/auth/api-client) .html ) Sie müssen einen GoogleApiClient verwenden, wie in meiner ursprünglichen Frage gezeigt (und für die Rückrufe).

1
TomDT

Die drei Rückrufe:

public void onConnectionFailed(ConnectionResult arg0){}
public void onConnected(Bundle bundle){}
public void onConnectionSuspended(int arg0){}

muss umgesetzt werden. Ich sehe jedoch nicht, dass onConnectionFailed überschrieben wird. Der Compiler sollte in diesem Fall einen Fehler gegeben haben. Es gibt zwei LocationListener-Implementierungen, eine für LocationListener und die andere gms.location.LocationListener. Vielleicht möchten Sie überprüfen, ob Sie die gms-Version verwenden.

Ich hoffe, dass Google ihren Trainingsbeispielcode an das neue Kundenmodell anpasst und weitere Verwirrung beseitigt.

1
GregM