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

这将是一个问题,如果两个不同的客户端尝试使用相同的回调。所以每个人都应该完全独立的客户端来完成这项工作。偶尔还是很奇怪 –

相关问题