Не удается подключиться к Google API CLient?

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

Неустранимое исключение: java.lang.IllegalStateException GoogleApiClient еще не подключен

GoogleApiClient выдает "GoogleApiClient еще не подключен" ПОСЛЕ вызова функции onConnected

Обратный вызов клиента Google API никогда не вызывается

Вызвано: java.lang.IllegalStateException: GoogleApiClient еще не подключен

Я пытаюсь использовать API LocationServices в сочетании с классом Geofence, чтобы проверить, находится ли пользователь в указанной области. Кажется, проблема заключается в связи с клиентом API Google и / или API Locationservices.

В своем манифесте я заявил следующее:

<service android:name=".GeofenceTransitionsIntentService" />

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="value of my key" />

</application>

В моем проекте объявлено 2 метода Java, которые взаимодействуют с GoogleApiClient:

 protected synchronized void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
}

public void startApiClient(){

    if (mGoogleApiClient.isConnected()) {
        Toast.makeText(this, getString(R.string.not_connected), Toast.LENGTH_SHORT).show();
        return;

        //Of course the Toast is supposed to fire of when the user cannot
        //connect to the google api. However when I make this code to run
        //when the user cannot connect to google play services it just shows 
        //the toast and does not report me the error which is why I in this 
        //case made this code to run when the user is connected to google play services

    }

    try {
        LocationServices.GeofencingApi.addGeofences
                (mGoogleApiClient, getGeofencingRequest(), getGeofencePendingIntent()).setResultCallback(this); // Result processed in onResult(). This is also the line where the app seems to crash because it is unable to connect to the google api client
    } catch (SecurityException securityException) {
        securityException.notify();
    }
}

Затем я вызываю buildGoogleApiClient() в моем методе onCreate() и вызываю startApiClient() в моем методе onStart():

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

…

buildGoogleApiClient();
}

_

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

    mGoogleApiClient.connect();

    startApiClient();

}

И в случае необходимости, метод onResult():

public void onResult(Status status) {
    if (status.isSuccess()) {
        // Update state and save in shared preferences.
        mGeofencesAdded = !mGeofencesAdded;
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        editor.putBoolean(Constants.GEOFENCES_ADDED_KEY, mGeofencesAdded);
        editor.apply();
    }

Странная вещь в этом заключается в том, что соединение действительно создается в течение некоторого времени. Когда я говорю программе показывать тост, когда пользователь не подключен, мой монитор Android сообщает мне, что соединение установлено, но тост все еще срабатывает. Однако, когда я говорю программе показывать тост, когда пользователь подключен к клиенту Google API, приложение вылетает и сообщает, что клиент Google API еще не подключился.

Заранее спасибо за то, что уделили мне время и помогли мне с этим. Пожалуйста, прости меня, если я наблюдаю за чем-то очень очевидным.

1 ответ

Пожалуйста, попробуйте пройти этот урок по Google Client Location в AndroidHive - API определения местоположения Android, используя Сервисы Google Play.

Как обсуждалось в данном руководстве, вам необходимо внести изменения в свою деятельность ниже, чтобы получить текущее местоположение пользователя.

  1. Сначала проверьте доступность Сервисов Google Play, позвонив по телефону checkPlayServices() в onResume()

  2. Как только сервисы play станут доступны на устройстве, создайте GoogleApiClient, позвонив buildGoogleApiClient() метод.

  3. Подключитесь к клиенту Google API, позвонив по телефону mGoogleApiClient.connect() в onStart() метод. Призвав это, onConnectionFailed(), onConnected() а также onConnectionSuspended() будет срабатывать в зависимости от состояния соединения.

  4. После успешного подключения Google API, displayLocation() должен быть вызван в onConnected() метод, чтобы получить текущее местоположение.

Кроме того, вы также можете проверить следующие возможные причины, по которым оповещения не работают должным образом, как указано в разделе Устранение неполадок входа в геозону. Это:

  • Точное местоположение недоступно внутри вашей геозоны, или ваша геозона слишком мала.
  • Wi-Fi выключен на устройстве. Убедитесь, что на вашем устройстве включен Wi-Fi и местоположение.
  • В вашей геозоне нет надежного сетевого подключения.
  • Оповещения могут быть поздно.

Важную информацию и примеры кодов можно найти в разделе Создание и мониторинг геозон и в данном руководстве.

Другие вопросы по тегам