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

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

что я сделал

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

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

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

  2. 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 (также https://stackoverflow.com/a/25013850/3802589). Тогда я все это и использовать это, но до сих пор я не получаю все обновления на месте.

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

Примечания

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

проект

построить.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

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

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

2 ответов


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

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


три обратного вызова:

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

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

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