我正在尝试制作一个具有位置感知功能的商业搜索应用程序。为此,我使用 Google Places 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$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()
,我如何得到该错误;第二:为什么这种情况只在某些时候发生。首先是否允许有多个客户端,或者如果不允许,您如何在同一 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
关于java - 一项 Activity 中是否可以有多个 GoogleApiClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754600/