摘要:用戶使用地圖的時候,但願不聯網就能展現地圖。這時,就須要使用到離線地圖了。如何在百度地圖SDK裏引入離線地圖呢?html
-------------------------------------------------------------------------------------------------------------------java
相關閱讀:android
一、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html api
二、【「零起點」--百度地圖手機SDK】如何建立一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.htmlapp
-------------------------------------------------------------------------------------------------------------------ide
1、下載離線地圖包函數
到官網下載離線地圖包,網址:http://shouji.baidu.com/map/map.html?from=3052ui
首先選擇了手機品牌和手機型號:spa
選擇好手機後,系統會出來提示。請選擇舊版本地圖進行下載。orm
由於目前SDK只能使用柵格圖,因此咱們必須下載舊版本的地圖。後期SDK將支持矢量圖,到時候北京市的離線地圖就從114M下降到14M了。
預計6月份就能使用新版離線地圖了~~~
好比,我選擇下載了北京市的離線地圖:
解壓後,有兩個文件。一個是BaiduMap,一個是安裝說明。
不要管安裝說明,把BaiduMap打開,能看到Mapdata文件夾。拷貝這個文件夾。
將Mapdata文件夾拷貝到手機SD卡的BaiduMapSdk文件夾根目錄下。
2、編寫離線地圖代碼
找到主java文件,並在activity裏申明變量。
MKOfflineMap mOffline = null; //離線地圖變量
而後在onCreate函數裏寫離線地圖初始化的代碼:
/** 離線地圖初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } } ); /** 離線地圖導入離線包 **/ int num = mOffline.scan(); //if (num != 0) mText.setText(String.format("已安裝%d個離線包", num));
3、連真機,看運行看結果。
看,這是沒有聯網,展現地圖的效果。
4、java文件所有源代碼
package com.baidu.searchpoi; import android.app.Activity; import android.os.Bundle; /** 引入類 **/ import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.location.Location; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.LocationListener; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MKLocationManager; import com.baidu.mapapi.MKOLUpdateElement; import com.baidu.mapapi.MKOfflineMap; import com.baidu.mapapi.MKOfflineMapListener; import com.baidu.mapapi.MKPlanNode; import com.baidu.mapapi.MKPoiResult; import com.baidu.mapapi.MKSearch; import com.baidu.mapapi.MKSearchListener; import com.baidu.mapapi.MKTransitRouteResult; import com.baidu.mapapi.MKWalkingRouteResult; import com.baidu.mapapi.MapActivity; import com.baidu.mapapi.MapController; import com.baidu.mapapi.MapView; import com.baidu.mapapi.MyLocationOverlay; import com.baidu.mapapi.Overlay; import com.baidu.mapapi.OverlayItem; import com.baidu.mapapi.PoiOverlay; import com.baidu.mapapi.RouteOverlay; import com.baidu.mapapi.TransitOverlay; /** activity **/ public class SearchPOIActivity extends MapActivity { //申明變量 BMapManager mBMapMan = null; MapView mMapView = null; MKOfflineMap mOffline = null; //離線地圖變量 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBMapMan = new BMapManager(getApplication()); mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null); super.initMapActivity(mBMapMan); mMapView = (MapView) findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); //設置啓用內置的縮放控件 MapController mMapController = mMapView.getController(); // 獲得mMapView的控制權,能夠用它控制和驅動平移和縮放 GeoPoint point = new GeoPoint((int) (39.93 * 1E6), (int) (116.42 * 1E6)); //用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6) mMapController.setCenter(point); //設置地圖中心點 mMapController.setZoom(13); //設置地圖zoom級別 //mMapView.setSatellite(true); //衛星圖 //mMapView.setTraffic(true); //交通流量 /** 離線地圖初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } } ); /** 離線地圖導入離線包 **/ int num = mOffline.scan(); //if (num != 0) mText.setText(String.format("已安裝%d個離線包", num)); } @Override protected boolean isRouteDisplayed() { return false; } @Override protected void onDestroy() { if (mBMapMan != null) { mBMapMan.destroy(); mBMapMan = null; } super.onDestroy(); } @Override protected void onPause() { if (mBMapMan != null) { mBMapMan.stop(); } super.onPause(); } @Override protected void onResume() { if (mBMapMan != null) { mBMapMan.start(); } super.onResume(); } }