2016-08-15 55 views
0

我正在使用Google Maps API构建一个简单的地图应用程序。当我打开应用程序时,它有时会崩溃,因为GoogleApiClient尚未连接。我有几个运行的方法需要连接API。在尝试连接之前先等待GoogleAPIClient加载

如何通过等待API连接来防止崩溃?

下面是我的一些代码: onConnected:

@Override 
public void onConnected(Bundle connectionHint) 
{ 
    // this callback will be invoked when all specified services are connected 
    //Must ask for explicit permission 
    //ie: Opening settings action in order to change or give permissions 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
     currentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleClient); 
     mGoogleClient.connect(); 

     if (currentLocation != null) 
     { 
      currentLatLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()); 
      mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15)); 
     } 

     else 
     { 
      if (mGoogleClient!=null) 
      { 
       mGoogleClient.connect(); 
      } 

      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleClient, locationRequest, this); 

     } 
    } 
} 

获取当前位置:

private void getLocation() { 

    locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(60 * 1000); 
    locationRequest.setFastestInterval(30 * 1000); 

    mGoogleClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

    if (mGoogleClient != null) 
    { 
     mGoogleClient.connect(); 
    } 


} 

我不知道需要什么。请让我知道是否需要提供更多代码。

编辑:崩溃日志

08-15 17:51:54.692 950-950/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.hensh.fusedmap, PID: 950 
              java.lang.IllegalStateException: GoogleApiClient is not connected yet. 
               at com.google.android.gms.common.api.internal.zzh.zzb(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzl.zzb(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzj.zzb(Unknown Source) 
               at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source) 
               at com.hensh.fusedmap.MapsActivity.onConnected(MapsActivity.java:667) 
               at com.google.android.gms.common.internal.zzk.zzk(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzj.zzi(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzh.zzpx(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzh.onConnected(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzl.onConnected(Unknown Source) 
               at com.google.android.gms.common.api.internal.zzc.onConnected(Unknown Source) 
               at com.google.android.gms.common.internal.zzj$zzg.zzqL(Unknown Source) 
               at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source) 
               at com.google.android.gms.common.internal.zzj$zza.zzw(Unknown Source) 
               at com.google.android.gms.common.internal.zzj$zzc.zzqN(Unknown Source) 
               at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:135) 
               at android.app.ActivityThread.main(ActivityThread.java:5294) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:372) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
+0

Post crash log。 –

+0

我猜你的地图没有准备好,导致崩溃,因为你的地址代码没问题。 – PatrickZenker

+0

请指明它崩溃的地方。你为什么要在你的onConnected中调用connect'mGoogleClient.connect();'? – tyczj

回答

2

的需求GoogleAPIClient连接您尝试使用服务之前。所以你拨打电话onConnected是错误的。如果您在onConnected这意味着连接的客户端。您需要在您的活动的onCreate中构建GoogleAPIClient,并且理想情况下将其连接到ActivityonStart

private GoogleApiClient mGoogleApiClient; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.<your-xml>); 

    mGoogleApiClient = new GoogleApiClient.Builder(context) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 
public void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

此外,建设时GoogleAPIClient还可以设置enableAutoManage()connectdisconnect进行自动管理,使您不必做手工,作为解释here

public class LocationActivity implements GoogleApiClient.OnConnectionFailedListener { 

    /** Google Services client */ 
    private GoogleApiClient mGoogleApiClient; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.payment_activity); 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .enableAutoManage(this, this) 
       .addApi(LocationServices.API) 
       .build(); 
} 
相关问题