66

Итак, я нашел кое-что, что не очень ясно для меня о GoogleApiClient. GoogleApiClient имеет функцию под названием onConnected который бежал, когда клиент подключен (обязательно)GoogleApiClient бросает «GoogleApiClient еще не подключен» ПОСЛЕ onConnected, получив вызов

я получил свою собственную функцию под названием: startLocationListening, который в конечном счете вызывался на onConnected функции GoogleApiClient в ,

Так что моя 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 

После этого я получил исключение.

Я что-то упустил? Я получил ответ на «подключен», я запустил мой func, и я получил ошибку «не подключен», что это? Плюс одна досадная вещь: я использовал эту службу определения местоположения в течение нескольких недель и никогда не получал эту ошибку.

EDIT:

Я добавил более конкретный выход журнала, просто взорван мой ум, проверить это:

выход
@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() как это возможно?

E D I T:

Поскольку никто не мог ответить на этот вопрос, даже с репутацией щедрот, я решил сообщить об этом как об ошибке в Google. Что было дальше, меня действительно удивило. Официальный ответ Google для моего доклада:

«Этот веб-сайт по вопросам разработчиков с источником кода AOSP Android и набор инструментов для разработчиков, а не приложений Google или услуг, таких как Play услуги, GMS или API, Google сожалению. похоже, что не будет подходящим местом для сообщения об ошибках в Play Services.Все, что я могу сказать , это то, что этот сайт не так, извините. Попробуйте опубликовать на Форуме продуктов Google . "

Полный выпуск report here. (я надеюсь, что они не будут удалять это только потому, что его глупо)

Так что да, я посмотрел на Google Форумы по продуктам и просто coudnt найти любую тему, чтобы опубликовать эту вещь, поэтому на момент Иам озадачен и застрял

ли anyobody на планете земля может помочь мне с этим

EDIT:.?

Полный код в pastebin

+0

Не могли бы вы добавить протоколирование в onConnectionSuspended(), а также, чтобы убедиться в том, что называется в любое время? –

+0

@AntiVeeranna Я также получил регистрацию в onConnectionSuspended(), когда эта функция никогда не вызывалась. –

+0

Можете ли вы также опубликовать код, который создает mGoogleApiClient? –

ответ

72

Я просто заметил, что вы создаете GoogleApiClient в onStartCommand(). Это кажется плохой идеей.

Предположим, что ваш сервис запускается дважды. Два объекта googleApiClient будут созданы, но вы будете иметь только ссылку на один. Если тот, чья ссылка у вас нет, выполняет свой обратный вызов onConnected(), вы будете подключены к этому клиенту, но клиент, чья ссылка, которую вы действительно делаете, все еще может быть отключена.

Я подозреваю, что это то, что происходит. Попробуйте переместить создание googleApiClient в onCreate и посмотреть, получилось ли у вас одинаковое поведение.

+0

Yup , Я думаю, вы получили это право! http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle – EyesClear

+0

Привет @iheanyi. Я создаю свой объект googleApiClient в методе onCreate() моего MainActivity. Но я получаю эту ошибку на некоторых устройствах. Что вы можете сказать об этом? –

+0

@SattarHummatli Трудно сказать. Ситуация в этом вопросе, вероятно, не единственный способ, которым кто-то может закончиться этой ошибкой. Сначала я должен проверить, что у вас нет аналогичных условий гонки - например, убедитесь, что вы создаете только googleApiClient в одном месте. Если у вас все еще есть проблема, попробуйте собрать [минимальный полный и проверяемый пример кода] (http://stackoverflow.com/help/mcve) и задать вопрос. Затем ответьте мне комментарием со ссылкой, и я посмотрю. – iheanyi

2

Я имел ту же ошибку, но моя проблема отличается от ответа iheanyl в:

Я декларируется GoogleApiClient статичным. Это помешало андроиду отключить службу.

-4

перемещение объекта googleApi в onCreate разрешил проблему для меня.

+8

Повторение принятого ответа никому не полезно, вы просто создаете шум –

-1

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

0

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

Вы должны создать экземпляр объекта клиента в методе вашей деятельности в OnCreate (Bundle), а затем вызывает соединение() в OnStart() и отсоединить() в OnStop(), независимо от состояния.

Реализация объекта GoogleApiClient предназначена только для одного экземпляра. Лучше всего создать экземпляр только один раз в onCreate, а затем выполнить соединения и отключения, используя один экземпляр.

0

вызов подключения() метод в 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; 
        } 
       }); 
    } 

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

  • Вам не нужно удалять приложение. Просто перейдите к настройкам/менеджеру приложений/вашим приложениям/разрешениям и отключите их, а затем снова проверьте приложение.
0

Я имел эту проблему до и я решил его объявить GoogleApiClient как статический объект

Смежные вопросы