是否可以在一个 activity 中包含多个 GoogleApiClient?

Is it possible to have multiple GoogleApiClients within one activity?

我正在尝试制作一个具有位置感知功能的商业搜索应用程序。为此,我使用 Google 地方 Api,特别是 Places.GEO_DATA_API 和 LocationServices.API。这个想法是用户可以使用他们当前的位置或使用自动完成搜索来输入地址。我的问题是我认为调用 onConnected() 时这两个 api 混淆了,因为我不断收到此错误:

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.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(),我怎么会收到该错误;第二:为什么这种情况只在某些时候发生。首先是否允许有多个客户端?如果不允许,您如何在同一个 activity 中使用两种不同的技术 (api)?

不要在 Activity/Fragment 中执行 implements 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/Fragment

中删除 implements GoogleApiClient.ConnectionCallbacks