2017-07-29 8 views
0

私はMapbox SDKを使用しており、地図を現在の場所に移動してズームしたいと考えています。ロケーションレイヤを有効にすると、正しい場所にドットが表示されます。しかし私のロケーションエンジンのリスナーは呼び出されていないので、私はカメラを動かすことができません。Mabox Android - 位置情報の更新がありません

onCreateViewGoogleApiClientで接続を開始します。それが接続されると、私は場所の設定をチェックして(場所の許可を確認した後に)電源が入っているかどうかを確認します。それが成功した場合、私はこれを行う:

if (locationEngine == null) { 
    locationEngine = new LocationSource(getActivity()); 
    locationEngine.requestLocationUpdates(); 
} 
Location location = locationEngine.getLastLocation(); // This returns null 

onLocationChanged(location); // This moves the camera if a location is passed in 

locationEngine.addLocationEngineListener(locationEngineListener); 

// This works, the location layer functions properly  
getMap(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(MapboxMap mapboxMap) { 

       mapboxMap.setMyLocationEnabled(true); 
      } 
     }); 

はここlocationEngineListenerが何をするかです:

private class Listener implements LocationEngineListener { 
     @Override 
     public void onConnected() { 
      // No action needed here. 
     } 

     @Override 
     public void onLocationChanged(Location location) { 

      CurrentLocationMap.this.onLocationChanged(location); 
     } 
    } 

問題がonLocationChangedで呼び出されることはありません。

答えて

1

これはまったく有効な解決策で、わずかに異なる状況で発生します。しかし、誰かが正確な概念を得るために、少しの説明ステップを追加したかったのです。あなたのコードでどのLocationEngineを使用しているのか分かりません。ここでは、LocationServices.FusedLocationApiをLocationEngineとして使用しています。 。をIntentServiceない)、ビルド、その後次のように GoogleApiClientを接続:Androidのコンポーネント(例えば、活動断片またはサービス

1)のonCreate()。ステップ1は、あなたが構築します

@Override 
    public void onDestroy() { 
     Log.i(TAG, "Service destroyed!"); 
     mGoogleApiClient.disconnect(); 
     super.onDestroy(); 
    } 

、として、buildGoogleApiClient()の実装は)

protected synchronized void buildGoogleApiClient() { 
     Log.i(TAG, "Building GoogleApiClient"); 

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

    } 

その後onDestroy(上、である、あなたはGoogleApiClientを切断することができます

buildGoogleApiClient(); 
mGoogleApiClient.connect(); 

GoogleApiClientを接続します。

1)GoogleApiClientインスタンスは、初めてonConnected()メソッドで接続されます。さて、あなたの次のステップは、Connected()メソッドを見てください。

@Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.i(TAG, "GoogleApiClient connected!"); 
     buildLocationSettingsRequest(); 
     createLocationRequest(); 
     location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     Log.i(TAG, " Location: " + location); //may return **null** because, I can't guarantee location has been changed immmediately 
    } 

以上、あなたは方法createLocationRequest()は、ロケーション要求を作成すると呼ばれます。方法createLocationRequest()は次のようになります。

3)次に、LocationListenerインターフェイスのonLocationChange()コールバックで、新しい場所を取得します。

@Override 
    public void onLocationChanged(Location location) { 
     Log.i(TAG, "Location Changed!"); 
     Log.i(TAG, " Location: " + location); //I guarantee,I get the changed location here 

    } 

あなたはLogcatでこのような結果を得る: 3月22日18:34:17.336 817から817/com.LiveEarthquakesAlerts I/LocationTracker:場所:場所[、37.421998を融合-122.084000 ACC = 20 et = + 15m35s840ms alt = 0.0]

これら3つの手順を実行できるようにするには、ビルドを設定しておく必要があります。

compile 'com.google.android.gms:play-services-location:10.2.1' 
+0

ありがとう、私はこれを代替位置として実行しますが、Mapbox API(私が使用しているもの)ははるかに単純なように見えます。しかし、それはGoogle APIの大きな答えです。 – nasch

+0

ここで提供したコードスニペットは、Google Playストアの自分のアプリの1つに使用したコードです。それは100%作業コードです。アイデアは同じです。 https://play.google.com/store/apps/details?id=com.LiveEarthquakesAlerts –

+1

私はそれがうまくいかないとは言わなかった、それはちょうど私が使用しているものとは異なるAPIを使用している。 – nasch

関連する問題