【问题标题】:Wait for GoogleAPIClient to load before trying to connect在尝试连接之前等待 GoogleAPIClient 加载
【发布时间】:2016-08-15 16:01:40
【问题描述】:

我正在使用 Google Maps API 构建一个简单的地图应用程序。当我打开应用程序时,它有时会崩溃,因为 GoogleApiClient 尚未连接。我有一些方法正在运行,需要连接 API。

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

这是我的一些代码: 已连接:

@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)

【问题讨论】:

  • 我猜你的地图还没有准备好并导致崩溃,因为你获取位置的代码没问题。
  • 请指定崩溃的位置。另外你为什么在你的 onConnected 中调用 connect mGoogleClient.connect();
  • 已添加崩溃日志。 onConnected 方法更像是“让我们现在连接”。当应用程序打开时它会崩溃(但过了一段时间它运行正常)
  • @PatrickZenker 这就是我要修复的问题,我如何才能等到地图准备好后再运行更多代码
  • 您的 onConnected 方法被调用,因为之前,在您的代码中的某处,您调用了 mGoogleClient.connect()。所以你不应该在 onConnected 中再次调用 connect()。

标签: android google-maps fusedlocationproviderapi


【解决方案1】:

在您尝试使用该服务之前,需要连接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();
}

【讨论】:

    【解决方案2】:

    您应该将代码 sn -p mMap.animateCamera... 等放入 onMapLoaded。

    Detect when Android v2 maps has loaded

    并在您的 onConnected 方法中删除 mGoogleClient.connect();,因为您不必连接两次(或更多)

    【讨论】:

      【解决方案3】:

      不清楚您希望应用程序如何运行。如果您希望您的位置显示在地图上并在您移动时更新:

      1. onCreate 中只实例化一次GoogleApiClient
      2. onResume 中连接GoogleApiClient
      3. onConnected 中提出您的位置请求
      4. onLocationChanged 中,移动您的地图。

      可能值得回顾:Fatal Exception: java.lang.IllegalStateException GoogleApiClient is not connected yet

      【讨论】:

        猜你喜欢
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 2019-10-28
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多