2016-05-10 8 views
0

バージョン4.0.0よりMapboxはability to download offline regionsをAndroid SDKに導入しました。私は、次のように、この機能を利用するためにしようとしている:マップボックスのオフライン領域 - 保存されたマップ領域を表示できません

  1. は、私はオンラインだとき、
  2. は数日
  3. 、アプリを閉じて、オフライン領域としてマップの可視部分をダウンロード後でネットワーク接続なしで、その地域のどこかを指し示す地図を使ってアプリを開き、地図を利用できるようにします。

しかし、それはそのようには動作しません。私はオフラインでアプリを実行すると、それはハングアップし、地図があるべきである灰色の表面だけです。ログは、マップボックスがマップタイルの要求を発行しようとしていることを示しています(マップはオフラインで使用可能であるため、必要はありません)。

地図のonMapReadyCallbackが呼び出されないことが判明し、Mapboxにユーザーを追跡する必要があることがマップの保存領域に表示されます。だから、そこに悪循環があるようです:地図が準備ができていないと私は保存された領域に行くことができない、それはオフラインなので、現在表示されているすべてのタイルをロードするまで地図は準備ができていません...

誰でも助けてもらえますか?参考のため


、ここで私は地域をダウンロードする方法は次のとおりです。

private void downloadWithinBounds() { 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(MapboxMap mapboxMap) { 
      Projection projection = mapboxMap.getProjection(); 
      LatLng topLeft = projection.fromScreenLocation(new PointF(0, 0)); 
      LatLng bottomRight = projection.fromScreenLocation(
        new PointF(mapView.getWidth(), mapView.getHeight())); 
      manager.createOfflineRegion(new OfflineTilePyramidRegionDefinition(
        Style.MAPBOX_STREETS, 
        new LatLngBounds.Builder() 
          .include(topLeft) 
          .include(bottomRight) 
          .build(), 
        mapboxMap.getCameraPosition().zoom, 
        mapboxMap.getMaxZoom(), 
        1.0f 
      ), new byte[0], new OfflineManager.CreateOfflineRegionCallback() { 
       @Override 
       public void onCreate(OfflineRegion offlineRegion) { 
        offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE); 
        offlineRegion.setObserver(new OfflineRegion.OfflineRegionObserver() { 
         @Override 
         public void onStatusChanged(OfflineRegionStatus status) { 
          if (status.isComplete()) { 
           Toast.makeText(MainActivity.this, "Done saving map.", Toast.LENGTH_SHORT).show(); 
          } 
         } 

         // ... 

        }); 
       } 

       // ... 

      }); 
     } 
    }); 
} 

、ここでは、私がのonCreateで正しい場所(にマップを移動しようとする方法です):

mapView.getMapAsync(new OnMapReadyCallback() { 
    @Override 
    public void onMapReady(final MapboxMap mapboxMap) { 
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Location last = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

     mapboxMap.setCameraPosition(new CameraPosition.Builder() 
       .zoom(INITIAL_ZOOM) 
       .target(last != null ? new LatLng(last.getLatitude(), last.getLongitude()) : null) 
       .build() 
     ); 
     mapboxMap.getTrackingSettings().setMyLocationTrackingMode(MyLocationTracking.TRACKING_FOLLOW); 
     mapboxMap.setMyLocationEnabled(true); 

     mapboxMap.setStyle(Style.MAPBOX_STREETS); 

     // ... 
    } 
}); 

onMapReady()は呼び出されません。


編集:ここはthe full source code of my activityです。

答えて

0

現在この問題の修正が行われており、4.0.1-SNAPSHOTを使用して問題が解決されるかどうかを確認できます。あなたはアプリのbuild.gradeを開き、これを使用してこれを行うことができます。

repositories { 
    mavenCentral() 
    maven { url "http://oss.sonatype.org/content/repositories/snapshots/" } 
} 

dependencies { 
    compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:[email protected]'){ 
     transitive=true 
    } 
} 
+0

あなたの答えに感謝します。 '4.0.1-SNAPSHOT'については、私はちょうどチェックしたし、それは助けにならない - 地図はこれまでと同じようにぶら下がっている。すぐにこれを修正するためにあなたのために私の指を横切っておくでしょう。 :) – pstobiecki

+0

'4.0.0'と' 4.0.1'を使って、コードスニペットを使って同じエラーを生成することができませんでした。もしあなたがもしあれば追加のコードであなたの質問を編集することは可能でしょうか?あなたの問題が解決しない場合は、[mapbox-gl-native repo](https://github.com/mapbox/mapbox-gl-native/issues)で問題を開くこともできます目。 – cammace

+0

質問にアクティビティの完全な情報源を追加しました。私が持っている問題を再現するのに役立ちます。 – pstobiecki

0

を私はあなたの問題を再現しようとしました。このhereに使用したコードを表示することができます。この例では、アイスランドのDalvik(65.970773、-18.532800)を指すxmlのカメラ位置を設定しています。 OnMapReadyコールバックでは、デバイス上に空き領域がない場合は、その領域をダウンロードしようとしています。私はデバイスを開いたままにして、ダウンロードが完了するのを待ちます。終了すると、強制的にアプリを閉じてWi-Fi /携帯電話ネットワークをオフにします。 マップを再度開くと、マップがロードされていないようです。

私はあなたのコードをステップ実行しようと、このブロックに気づい:

LatLng topLeft = projection.fromScreenLocation(new PointF(0, 0)); 
    LatLng bottomRight = projection.fromScreenLocation(
      new PointF(mMapView.getWidth(), mMapView.getHeight())); 

    LatLngBounds bounds = new LatLngBounds.Builder() 
      .include(topLeft) 
      .include(bottomRight) 
      .build(); 

私はmMapView.getWidth() & mMapView.getHeightがまだ測定されていないと0 respectivlyを戻ってきているので、TOPLEFTとbottomRightは同じ緯度経度であることを見ています。これらをDalvik地域のハードコードされたLatLngに置き換えると、私のためにこれが解決され、地図がロードされます。 動作させたコードはhereです。

+0

私のコードとあなたの違いは、ダウンロードしようとしていることですアクティビティの作成直後にマップが作成されます(その間にはいくつかのスレッドがありますが、ダウンロードは基本的に 'onCreate()'の中で起動されます)。私はマップが既にオフラインのために地図上に表示されている領域を保存することができますの背後にあるアイデアがユーザーに表示されているときに、ユーザーアクションとしてダウンロードプロセスを実行しています。だから私の場合、 'mMapView.getWidth()'と 'mMapView.getHeight()'は非ゼロです。 – pstobiecki

+0

質問にアクティビティの完全なソースを追加しました。問題が再現されるのを助けてくれることを願っています。 – pstobiecki

関連する問題