2016-08-15 10 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(); 
    } 


} 

私は必要とされている他に何かわかりません。より多くのコードを提供する必要がある場合はお知らせください。

編集:onMapLoadedにクラッシュログ

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

ポストクラッシュログ。 –

+0

場所を取得するためのコードが大丈夫であるため、地図が準備されておらず、クラッシュしているようです。 – PatrickZenker

+0

クラッシュする場所を指定してください。また、なぜあなたはあなたのonConnectedで 'mGoogleClient.connect();'を呼び出すのですか? – tyczj

答えて

2

GoogleAPIClientニーズを。したがって、onConnectedに接続するための電話は間違っています。 onConnectedの場合は、クライアントに接続されています。アクティビティのonCreateGoogleAPIClientを作成し、ActivityonStartに接続するのが理想的です。作成時にhereを説明するように、手動でそれを行うには持っていけないよう

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あなたも自動的に管理することがconnectdisconnectためenableAutoManage()を設定することができます。

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(); 
} 
0

あなたは、コードスニペットmMap.animateCamera...などを配置する必要があります。

Detect when Android v2 maps has loaded

そして、あなたは二回(またはそれ以上)を接続する必要はありませんのでごonConnected方法でmGoogleClient.connect();を削除

0

それはあなたのアプリケーションが機能するようにしたいかは不明です。あなたの場所が地図上に表示し、更新したい場合は、移動したとき:

  1. 一度だけonCreateでインスタンス化GoogleApiClient
  2. GoogleApiClientonResumeに接続します。
  3. には、ご要望をお寄せください
  4. onLocationChangedに地図を移動してください。

それは検討する価値があるでしょう:あなたがサービスを使用しようとする前に、接続するFatal Exception: java.lang.IllegalStateException GoogleApiClient is not connected yet

関連する問題