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

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

Что я наделал

  1. Руководство для разработчиков Android. Прежде всего, я следовал инструкциям на сайте разработчиков Android (developer.android.com/training/location/receive-location-updates.html).

    Как указано там, я использовал Location, 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, может быть, у меня что-то не так, но все работает нормально.

Проект

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();
    }

бревенчатый кот

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, но... Меня беспокоит, что это так сложно (предположительно, проще).


person TomDT    schedule 30.07.2014    source источник
comment
Он использует запрос высокой точности. Это означает, что ему нужен GPS. Вы уверены, что у вас заблокирован GPS? Если вы отлаживаете, вы, вероятно, находитесь в помещении, и это, как правило, не работает. Значок GPS не горит вообще, горит, но мигает или горит постоянно?   -  person Gabe Sechan    schedule 31.07.2014
comment
:'( Да, на самом деле это наклон ... Хотя, по-видимому, это было также из-за того, что мое соединение с Wi-Fi было ненастоящим, потому что был процесс аутентификации, которого я не заметил, поэтому в основном я не был подключен (Доступ к веб-сайтам, но может быть, не к другим функциям?) Я только что попробовал это с двумя устройствами и получил обновления нормально (аутентифицировано), а не на другом ... И да, я в помещении, поэтому, возможно, поэтому я получаю наклонный GPS но, как я читал, HIGH_ACCURACY этого не требует (но скорее всего) - preview.tinyurl.com /k6ew5uv В любом случае, спасибо!   -  person TomDT    schedule 31.07.2014
comment
Из этой ссылки: PRIORITY_HIGH_ACCURACY, скорее всего, будет использовать GPS, поэтому да, он использует GPS. В одних случаях может и не быть, но в других точно есть.   -  person Gabe Sechan    schedule 31.07.2014
comment
Ах да, я как раз думал о том, почему он до сих пор работает только с Wi-Fi :)   -  person TomDT    schedule 31.07.2014


Ответы (2)


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

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

person TomDT    schedule 14.11.2014
comment
Я сделал аналогичную вам ошибку - не включил GPS на своем эмуляторе. Так легко забыть включить GPS, и Genymotion, кажется, показывает значок местоположения на панели уведомлений, даже если GPS не включен в эмуляторе. - person Simon; 24.05.2015
comment
Привет, не могли бы вы сказать мне, что не так с вашим кодом выше? У меня тоже есть такая же проблема. Мой Wi-Fi включен, а также мой GPS. Спасибо - person Dark Leonhart; 22.02.2016

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

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

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

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

person GregM    schedule 22.08.2014