0

Я пытаюсь сделать приложение поиска бизнеса, которое известно о местоположении. Для этого я использую 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) в одном и том же действии?

ответ

1

Не делайте implements ConnectionCallbacks в вашем Activity/Fragment и попробуйте следующее:

GoogleApiClient.ConnectionCallbacks mGoogleApiLocationCallback = new GoogleApiClient.ConnectionCallbacks() { 
     @Override 
     public void onConnected(@Nullable Bundle bundle) { 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 
    }; 

    GoogleApiClient.ConnectionCallbacks mGoogleApiAutoCompleteCallback = new GoogleApiClient.ConnectionCallbacks() { 
     @Override 
     public void onConnected(@Nullable Bundle bundle) { 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 
    }; 

А затем изменить свой метод, как это:

protected synchronized void buildGoogleApiClient(){ 
    mGoogleApiLocation = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(mGoogleApiLocationCallback) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiAutoComplete = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(mGoogleApiAutoCompleteCallback) 
      .addApi(Places.GEO_DATA_API) 
      .enableAutoManage(this,GOOGLE_API_CLIENT_ID,this) 
      .build(); 
} 

Просто убедитесь, чтобы удалить implements GoogleApiClient.ConnectionCallbacks из вашего Activity/Fragment

+0

Я не сумасшедший, хотя правильный ... это, вероятно, где ошибка. Ранее существовал конфликт между двумя API, но у вас может быть несколько. Это больше не сбой, но, как я уже говорил, это случалось только иногда. – mmera

+0

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