0

我試圖使一個企業搜索應用程序,是位置感知。要做到這一點我使用谷歌Places API的,特別是Places.GEO_DATA_API和LocationServices.API。這個想法是,用戶可以使用他們當前的位置或使用自動完成搜索來輸入地址。我的問題是,我想打電話時onConnected(),因爲我不斷收到此錯誤兩個API是混錯:是否有可能有一個活動中的多個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) 

它只是有時會發生。除了此次崩潰,我已成功運行該程序,沒有任何意外的行爲。

建立API中的代碼如下:

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()和兩個:爲什麼這只是發生了一些時間。是具有允許在首位多個客戶端,或者如果不是你怎麼去在同一個活動是利用兩種不同的技術(API)的?

回答

1

不要在您的Activity/Fragmentimplements ConnectionCallbacks和嘗試以下操作:

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(); 
} 

只要確保從您的Activity刪除implements GoogleApiClient.ConnectionCallbacks/Fragment

+0

我沒瘋,雖然權......這可能是其中的bug了。之前兩個API之間存在衝突,但您可以擁有多個API。它不再崩潰,但就像我說的那樣,它偶爾會這樣做。 – mmera

+0

這將是一個問題,如果兩個不同的客戶端嘗試使用相同的回調。所以每個人都應該完全獨立的客戶端來完成這項工作。偶爾還是很奇怪 –

相關問題