web-dev-qa-db-fra.com

Non mise à jour de GoogleApiClient + LocationServices

J'essaie simplement de créer une application "tutorielle" simple pour obtenir l'emplacement de mon téléphone (pour apprendre à l'utiliser plus tard dans une autre application), mais je ne vais nulle part.

Ce que j'ai fait

  1. Tutoriel du développeur Android: Tout d'abord, j'ai suivi le tutoriel sur le site de développement d'Android (developer.Android.com/training/location/receive-location-updates.html). 

    Comme indiqué, j’ai utilisé un Location, LocationClient et LocationRequest pour les initialiser (et les configurer) dans onCreate. LocationClient est connecté et déconnecté dans onStart et onStop.

    Je demande une mise à jour de l'emplacement après ma connexion (dans onConnected). Je vérifie que GooglePlayServices est disponible avant de passer cet appel et je ne reçois toujours aucune mise à jour dans "onLocationChanged".

  2. GoogleApiClient: J'ai remarqué que LocationClient est obsolète et que LocationServices est préférable (developer.Android.com/reference/com/google/Android/gms/location/LocationClient.html).

    Comme indiqué ici: https://developer.Android.com/reference/com/google/Android/gms/location/FusedLocationProviderApi.html , j'utilise GoogleApiClient et le configure sur LocationServices (également https://stackoverflow.com/a/25013850/3802589 ). Alors, j'ai tout configuré pour l'utiliser, mais je ne reçois toujours aucune mise à jour sur l'emplacement. 

onLocationChanged devrait imprimer s'il y a une réponse. J'ai également mis un bouton qui imprime l'emplacement ou «rien».

Remarques

J'ai vérifié avec Google Maps si j'avais peut-être quelque chose, mais ça fonctionne très bien.

Projet

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.+"
}

Manifeste

...
<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

J'ai l'impression que j'oublie peut-être quelque chose de très simple ... mais je ne le vois pas et j'ai passé trop de temps à essayer d'obtenir un endroit simple ...

Je pourrais peut-être simplement utiliser l'API Android.location mais ... Cela me gêne que ce soit si difficile (soi-disant plus facile).

12
TomDT

L'erreur était seulement que le wifi n'était pas allumé ... Et je n'ai pas réalisé.

En ce qui concerne ce que GregM a dit, si je ne me trompe pas, c'est l'ancienne API (la plupart d'entre elles est obsolète maintenant) et comme indiqué sur le site du développeur ( https://developer.Android.com/google/auth/api-client .html ) vous devez utiliser GoogleApiClient comme indiqué dans ma question initiale (et même pour les rappels).

1
TomDT

Les trois rappels:

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

doit être mis en œuvre. Cependant, je ne vois pas onConnectionFailed être remplacé. Le compilateur aurait dû donner une erreur dans ce cas. Il existe deux implémentations LocationListener, une pour LocationListener et l'autre gms.location.LocationListener. Vous voudrez peut-être vérifier si vous utilisez la version de gms.

J'espère que Google mettra à jour leur exemple de code de formation pour le nouveau modèle client et évitera toute confusion supplémentaire.

1
GregM