从版本4.0.0开始,Mapbox将ability to download offline regions引入了他们的Android SDK。我试图通过以下方式使用此功能:
但似乎并没有这样做。当我离线运行应用程序时,它会挂起,并且只有地图应该是灰色表面。日志表明Mapbox一直在尝试发布地图图块的请求(不应该这样做,因为地图应该可以离线使用)。
快速调试显示地图的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()永远不会被调用。
答案 0 :(得分: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:4.0.1-SNAPSHOT@aar'){
transitive=true
}
}
答案 1 :(得分:0)
我尝试重现你的问题。您可以查看我为此here使用的代码。在这个例子中,我将我的相机位置设置为xml,指向冰岛的Dalvik(65.970773,-18.532800)。在OnMapReady回调中,如果设备上没有可用的,我正在尝试下载该区域。我打开设备并等待下载完成。完成后我强制关闭应用程序并关闭wifi /蜂窝网络。 当我重新打开地图时,似乎没有加载地图。
我尝试单步执行代码并注意到这个块:
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();
我看到topLeft和bottomRight是相同的LatLng,因为mMapView.getWidth()
& mMapView.getHeight
尚未测量,并且分别返回0。用来自Dalvik地区周围的硬编码LatLng替换这些解决了这个问题并且加载了地图。
我找到了here能够使其工作的代码。