GoogleApiClient бросает "GoogleApiClient еще не подключен" ПОСЛЕ ONConnected функция вызова
Итак, я нашел кое-что, что мне не очень понятно о 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
После этого я получил исключение.
Я что-то упустил? Я получил ответ на "подключен", я запустил мой func, и я получил ошибку "не подключен", что это? Плюс одна раздражающая вещь: я использовал эту службу определения местоположения в течение нескольких недель и никогда не получал эту ошибку.
E D я T:
Я добавил более конкретный вывод журнала, просто взорвал мой разум, проверьте это:
@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 я T:
Так как никто не мог ответить на это даже с благодарностью за репутацию, , я решил сообщить об этом как об ошибке для Google. То, что было дальше, действительно меня удивило.
Официальный ответ Google на мой отчет:
"Этот веб-сайт предназначен для разработчиков с помощью источника AOSP для Android код и набор инструментов разработчика, а не приложения или службы Google, такие как Службы воспроизведения, GMS или API Google. К сожалению, похоже, быть подходящим местом для сообщения об ошибках в Play Services. Все, что я могу скажите, что этот сайт не так, извините. Попробуйте опубликовать в Google Форум продуктов."
Полный выпуск отчет здесь. (Надеюсь, они не удалят его только потому, что его глупо)
Итак, я посмотрел на Google Product Forums и просто нашел какую-либо тему для публикации этой вещи, поэтому на данный момент ям озадачен и застрял.
Может ли кто-нибудь на планете Земля помочь мне с этим?
E D я T:
Полный код в pastebin
Ответы
Ответ 1
Я только заметил, что вы создаете googleApiClient в onStartCommand(). Это кажется плохой идеей.
Скажем, что ваш сервис запускается дважды. Два объекта googleApiClient будут созданы, но вы будете иметь только ссылку на один. Если тот, чья ссылка у вас нет, выполняет обратный вызов onConnected(), вы будете подключены к этому клиенту, но клиент, чья ссылка, которую вы действительно делаете, все еще может быть отключена.
Я подозреваю, что происходит. Попробуйте переместить создание googleApiClient в onCreate и посмотреть, получилось ли у вас одинаковое поведение.
Ответ 2
У меня была такая же ошибка, но моя проблема отличалась от iheanyl ответа:
Я объявил статику googleApiClient. Это помешало андроиду отключить службу.
Ответ 3
https://developer.android.com/reference/com/google/android/gms/common/api/GoogleApiClient.html
Вы должны создать экземпляр объекта клиента в методе Activity onCreate (Bundle), а затем вызвать connect() в onStart() и отключить() в onStop() независимо от состояния.
Реализация GoogleApiClient создается только для одного экземпляра. Лучше всего создать экземпляр только один раз в onCreate, а затем выполнить соединения и отключения, используя один экземпляр.
Ответ 4
вызов метода 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();
}
Ответ 5
Я думаю, что нашел корень проблемы и не имеет никакого отношения к 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;
}
});
}
Мы могли бы также разделить разрешение на использование, и если оно было предоставлено, то вызовите вызов задачи. Хорошо, я собираюсь признаться, что использую фрагмент, и я переустановил приложение, даже повернув экран на разрешениях и однажды предоставив результат. Надеюсь, это поможет другим людям.
- Вам не нужно удалять приложение. Просто перейдите к настройкам/менеджеру приложений/вашим приложениям/разрешениям и отключите их, а затем снова проверьте приложение.
Ответ 6
У меня была эта проблема, и я решил ее с объявлением googleApiClient как статического объекта
Ответ 7
У меня была эта проблема, когда я случайно, но googleApiClient.connect() в oncreate и onresume. Просто удалил его из oncreate.
Ответ 8
перемещение создания googleApi в onCreate разрешило проблему для меня.