Использование GoogleApiClient + LocationServices не обновляется

Я просто пытаюсь сделать простое приложение "tutorial", чтобы получить свое местоположение телефона (чтобы узнать, как его использовать позже в каком-либо другом приложении), но я просто ничего не получаю.

Что я сделал

  • Учебник для разработчиков Android:. Сначала я пошел по учебному курсу на сайте разработчика Android (developer.android.com/training/location/receive-location-updates.html).

    Как и указано здесь, я использовал Location, LocationClient и LocationRequest, инициализируя их (и настраивая их) в onCreate. LocationClient подключен и отключен в onStart и onStop.

    Я запрашиваю обновление местоположения после подключения (в onConnected). Я проверяю, что GooglePlayServices доступны перед тем, как сделать этот вызов, и я все еще не получаю никакого обновления в "onLocationChanged".

  • GoogleApiClient: Я заметил, что LocationClient устарел и предпочитаются LocationServices (developer.android.com/reference/com/google/android/gms/location/LocationClient.html).

    Как указано здесь: https://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html, я использую GoogleApiClient и устанавливаю его в LocationServices (также qaru.site/info/12533/...). Поэтому я решил использовать все это, но все равно я не получаю никаких обновлений в этом месте.

onLocationChanged он должен печатать, если есть ответ. Я также нажимаю кнопку, которая печатает местоположение или "ничего".

Примечания

Я проверил с помощью Google Maps, чтобы увидеть, может быть, у меня что-то было, но он работает нормально.

Проект

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

манифеста

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

код

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

Я чувствую, что могу забыть что-то очень простое... но я просто не вижу его, и я потратил слишком много времени, пытаясь получить простое место...

Я мог бы просто использовать API android.location, но... Меня беспокоит, что это так сложно (возможно, проще).

Ответ 1

Ошибка была только в том, что Wi-Fi не был включен... И я не понимал.

Что касается того, что сказал ГрегМ, если я прав, что старый API (большая часть его устарела сейчас) и как указано на сайте разработчика (https://developer.android.com/google/auth/api-client.html), вы должны использовать GoogleApiClient, как показано в моем исходном вопросе (и то же самое для обратных вызовов).

Ответ 2

Три обратных вызова:

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

должен быть реализован. Однако я не вижу переопределения onConnectionFailed. Компилятор должен был дать ошибку в этом случае. Существуют две реализации LocationListener для LocationListener, а другая gms.location.LocationListener. Вы можете проверить, используете ли вы версию gms.

Я надеюсь, что Google обновит свой пример кода обучения до новой модели клиента и устранит дальнейшую путаницу.