GoogleApiClient кидає “GoogleApiClient ще не підключений” ПІСЛЯ onConnected виклику функції


74

Тож я знайшов щось не дуже зрозуміле для мене щодо GoogleApiClient. GoogleApiClient має функцію onConnected, яка запускається при підключенні клієнта (точно).

Я отримав власну функцію, яка називається: startLocationListening, яка врешті-решт отримує виклик від функції GoogleApiClient onConnected .

Тож моя функція startLocationListening не могла працювати без з’єднання GoogleApiClient.

Код і журнал:

@Override
public void onConnected(Bundle bundle) {
    log("Google_Api_Client:connected.");
    initLocationRequest();
    startLocationListening(); //Exception caught inside this function
}

...

private void startLocationListening() {
    log("Starting_location_listening:now");

    //Exception caught here below:
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
   }

Винятком є:

03-30 12:23:28.947: E/AndroidRuntime(4936):     java.lang.IllegalStateException: GoogleApiClient is not connected yet.
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.jx.a(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.common.api.c.b(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at com.google.android.gms.internal.nf.requestLocationUpdates(Unknown Source)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.startLocationListening(GpsService.java:169)
03-30 12:23:28.947: E/AndroidRuntime(4936):     at hu.company.testproject.service.GpsService.onConnected(GpsService.java:259)

...

Мій журнал налагодження також говорить, що функція onConnected отримала виклик :

03-30 12:23:28.847: I/Locationing_GpsService(4936): Google_Api_Client:connected.
03-30 12:23:28.857: I/Locationing_GpsService(4936): initLocationRequest:initing_now
03-30 12:23:28.877: I/Locationing_GpsService(4936): initLocationRequest:interval_5000
03-30 12:23:28.897: I/Locationing_GpsService(4936): initLocationRequest:priority_100
03-30 12:23:28.917: I/Locationing_GpsService(4936): Starting_location_listening:now

Після цього я отримав виняток.

Мені чогось тут не вистачає? Я отримав відповідь на "підключений", я запустив свою функцію і отримав помилку "не підключений", що це? Плюс одна прикрі речі: я користувався цією службою локації вже кілька тижнів і ніколи не отримував цієї помилки.

РЕДАГУВАТИ:

Я додав більш конкретний висновок журналу, просто задумався, перевірте це:

@Override
    public void onConnected(Bundle bundle) {

        if(mGoogleApiClient.isConnected()){
            log("Google_Api_Client: It was connected on (onConnected) function, working as it should.");
        }
        else{
            log("Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.");
        }

        initLocationRequest();
        startLocationListening();
    }

виведення журналу в цьому випадку:

03-30 16:20:00.950: I/Locationing_GpsService(16608): Google_Api_Client:connected.
03-30 16:20:00.960: I/Locationing_GpsService(16608): Google_Api_Client: It was NOT connected on (onConnected) function, It is definetly bugged.

Так, я щойно потрапив mGoogleApiClient.isConnected() == falseвсередину, onConnected()як це можливо?

РЕДАГУВАТИ:

Оскільки ніхто не міг відповісти на це, навіть з репутацією, я вирішив повідомити про це як про помилку в Google. Те, що відбулося далі, насправді здивувало. Офіційна відповідь Google на мій звіт:

"Цей веб-сайт призначений для проблем розробників із вихідним кодом Android AOSP та набором інструментів для розробників, а не для програм або служб Google, таких як сервіси Play, GMS або API Google. На жаль, здається, що не існує відповідного місця для повідомлення про помилки в сервісах Play . Все, що я можу сказати, це те, що цей веб-сайт - це не так, вибачте. Натомість спробуйте розміщувати повідомлення на форумах продуктів Google ".

Повний звіт тут. (Сподіваюсь, вони не видалять його лише тому, що це дурно)

Так, так, я подивився на форумах продуктів Google і просто не міг знайти жодної теми, щоб розмістити цю інформацію, тому на даний момент я спантеличений і застряг.

Хтось на планеті Земля міг би мені в цьому допомогти?

РЕДАГУВАТИ:

Повний код у пастебіні


Не могли б ви також додати журналювання до onConnectionSuspended (), щоб побачити, чи викликається це в будь-який час?
Anti Veeranna

@AntiVeeranna Я також отримав журнал на onConnectionSuspended (), оскільки ця функція ніколи не викликалася.
Адам Вархеджі,

Чи можете ви також опублікувати код, який створює mGoogleApiClient?
Anti Veeranna,

@AntiVeeranna Додав код у pastebin
Адам Вархеджі

1
@Dima, як сказав iheanyi: "Спробуйте перенести ваше створення googleApiClient у onCreate і подивіться, чи отримаєте ви таку ж поведінку." це гарантує, що з googleApiClient народиться лише один примірник, і ваша служба більше не буде містити неправильних посилань.
Адам Вархеджі,

Відповіді:


85

Я щойно помітив, що ви створюєте googleApiClient у onStartCommand (). Це здається поганою ідеєю.

Скажімо, ваша послуга запускається двічі. Будуть створені два об’єкти googleApiClient, але ви матимете посилання лише на один. Якщо той, чий посилання у вас відсутній, виконує зворотний виклик onConnected (), ви будете підключені в цьому клієнті, але клієнт, посилання якого ви насправді маєте, все ще може бути відключений.

Я підозрюю, що саме це відбувається. Спробуйте перемістити своє створення googleApiClient у onCreate і перевірте, чи не спостерігається у вас така сама поведінка.


Так, я думаю, ви правильно зрозуміли! developer.android.com/reference/android/app/…
EyesClear

Привіт @iheanyi. Я створюю свій об'єкт "googleApiClient" за методом onCreate () моєї MainActivity. Але я отримую цю помилку на деяких пристроях. Що ви можете сказати з цього приводу?
Саттар Гумматлі,

@SattarHummatli Важко сказати. Ситуація в цьому питанні, мабуть, не єдиний спосіб, коли хтось може закінчити цю помилку. Спочатку я б перевірив, що у вас немає подібних умов перегонів - наприклад, переконайтеся, що ви створюєте googleApiClient лише в одному місці. Якщо проблема все ще є, спробуйте зібрати мінімальний повний і перевіряється приклад коду та опублікувати запитання. Тоді дайте мені коментар із посиланням, і я подивлюсь.
iheanyi

2

У мене була та сама помилка, але моя проблема відрізнялася від відповіді iheanyl:

Я оголосив googleApiClient статичним. Це завадило android вимкнути службу.


2

У мене була ця проблема, і я вирішив її, оголосивши googleApiClient статичним об'єктом


0

https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html

Вам слід створити екземпляр об’єкта клієнта у методі onCreate (Bundle) вашого Activity, а потім викликати connect () у onStart () та disconnect () у onStop (), незалежно від стану.

Реалізація GoogleApiClient, здається, розроблена лише для одного екземпляра. Найкраще створити його лише один раз у програмі onCreate, а потім виконувати підключення та відключення за допомогою одного екземпляра.


0

виклик методу connect () у методі onStart ()

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

           // Call GoogleApiClient connection when starting the Activity
           googleApiClient.connect();
       }

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

           // Disconnect GoogleApiClient when stopping Activity
           googleApiClient.disconnect();
       }

0

Я думаю, що я знайшов корінь проблеми, і це не має нічого спільного з API. Я стикався з цим щоразу, коли встановлюю програму. До речі, як і найпопулярніший коментар, у мене є лише один googleApiClient після паузи та відновлення. Я помітив, що з’являється запит на отримання дозволу на отримання доступу до геолокації. Як ви знаєте у своїй діяльності, ця ситуація перетвориться на паузу, а після спливаючого вікна вона відновлює вашу активність. Швидше за все, ваш googleClient також прикутий до цих подій для відключення та підключення. Ви можете сказати, що зв’язок відсутній, коли дозвіл буде прийнято, і ви збираєтеся виконати завдання googleApiClient.

 if(googleApiClient.isConnected()){

        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {

                 if (granted) {
                        //here it could be client is already disconnected!!     
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                    }
                });
    }

Ви можете пропустити відключення та підключення, встановивши прапор, який відповідає дійсності перед дозволом, і після того, як завдання googleApiClient буде виконане або grantedбуде помилковим.

if(googleApiClient.isConnected()){
        isRequestingPermission = true;
        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {
                    if (granted && googleApiClient.isConnected()) {
                        //Once the task succeeds or fails set flag to false
                        //at _geolocateAddress
                        _geolocateAddress(response);
                    } else {
                        // Oups permission denied
                        isRequestingPermission = false;
                    }
                });
    }

Ми також можемо розділити виконання дозволу самостійно, і якщо буде надано, тоді буде здійснено виклик завдання. Гаразд, я зізнаюся, що використовую фрагмент, і я перевстановив програму, навіть повернув екран на дозволи і після надання отримав результат. Сподіваюся, це допомагає іншим людям.

  • Вам не потрібно видаляти програму. Просто перейдіть до налаштування / диспетчера програм / вашого додатка / дозволів і вимкніть будь-яке, а потім знову протестуйте програму.


-1

У мене виникла ця проблема, коли я випадково, але googleApiClient.connect () в oncreate і onresume. Просто видалив його з oncreate.


-4

переміщення створення googleApi до onCreate вирішило проблему для мене.


9
Повторення прийнятої відповіді нікому не корисно, ви просто створюєте шум
Тим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.