Я пытаюсь сделать приложение поиска бизнеса, которое известно о местоположении. Для этого я использую Google Places Api, в частности, Places.GEO_DATA_API и LocationServices.API. Идея состоит в том, что пользователь может использовать свое текущее местоположение или использовать поиск автозаполнения для ввода адреса. Моя проблема заключается в том, что я думаю, что эти два APIs становятся перепутаны при вызове onConnected()
, так как я получаю эту ошибку:Возможно ли иметь несколько GoogleApiClients в течение одного действия?
E/AndroidRuntime: FATAL EXCEPTION: main
Process: edu.depaul.csc472.coffeeshoplocator, PID: 9420
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
at com.google.android.gms.internal.zzrb.zzb(Unknown Source)
at com.google.android.gms.internal.zzrf.zzb(Unknown Source)
at com.google.android.gms.internal.zzrd.zzb(Unknown Source)
at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
at edu.depaul.csc472.coffeeshoplocator.MainActivity.startLocationUpdates(MainActivity.java:233)
at edu.depaul.csc472.coffeeshoplocator.MainActivity.getLocation(MainActivity.java:241)
at edu.depaul.csc472.coffeeshoplocator.MainActivity.onConnected(MainActivity.java:263)
at com.google.android.gms.common.internal.zzk.zzp(Unknown Source)
at com.google.android.gms.internal.zzrd.zzn(Unknown Source)
at com.google.android.gms.internal.zzrb.zzass(Unknown Source)
at com.google.android.gms.internal.zzrb.onConnected(Unknown Source)
at com.google.android.gms.internal.zzrf.onConnected(Unknown Source)
at com.google.android.gms.internal.zzqr.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzj$1.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zze$zzj.zzavj(Unknown Source)
at com.google.android.gms.common.internal.zze$zza.zzc(Unknown Source)
at com.google.android.gms.common.internal.zze$zza.zzv(Unknown Source)
at com.google.android.gms.common.internal.zze$zze.zzavl(Unknown Source)
at com.google.android.gms.common.internal.zze$zzd.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Это происходит только иногда. Я успешно запускал программу без какого-либо неожиданного поведения, кроме этого сбоя.
Код для построения Апис следующее:
protected synchronized void buildGoogleApiClient(){
mGoogleApiLocation = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiAutoComplete = new GoogleApiClient.Builder(this)
.addApi(Places.GEO_DATA_API)
.enableAutoManage(this,GOOGLE_API_CLIENT_ID,this)
.addConnectionCallbacks(this)
.build();
}
А вот мой onConnected()
метод, который запрашивает разрешение на доступ к прекрасно расположен от пользователя, а затем пытается получить местоположение пользователя:
@Override
public void onConnected(Bundle bundle) {
requestForSpecificPermission();
getLocation();
placeArrayAdapter.setGoogleApiClient(mGoogleApiAutoComplete);
}
... и мой getLocation()
метод:
private void getLocation(){
try {
location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiLocation);
if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiLocation, locationRequest, this);
}
else{
handleNewLocation(location);
}
}catch (SecurityException e){
Toast.makeText(getApplicationContext(),
"You don't have permission!", Toast.LENGTH_LONG)
.show();
}
}
Мое любопытство одно: как я получаю эту ошибку, если из моего понимания вы должны быть подключены к вызову onConnected()
и два: почему это происходит только в некоторых случаях. Имеет ли в первую очередь несколько клиентов, а если нет, то как вы собираетесь использовать две разные технологии (apis) в одном и том же действии?
Я не сумасшедший, хотя правильный ... это, вероятно, где ошибка. Ранее существовал конфликт между двумя API, но у вас может быть несколько. Это больше не сбой, но, как я уже говорил, это случалось только иногда. – mmera
Это будет проблема, если два разных Клиента пытаются использовать один и тот же обратный вызов. Поэтому, имея полностью отдельный клиент для каждого, нужно выполнять эту работу. Еще странно, что это было время от времени –