一、概述
最新版的百度地圖SDK3.0,修改了很多方法,之前的很多方法被簡化了,正好在做地圖這一塊,順便就使用了最新版的sdk。
下載官方給的demo,發現變化還是挺大的,之前的一些方法都換了,地圖的初始化也進行了調整。多了好幾個類,具體用法參考下面的例子,詳細的說明可參照官方的說明文檔。
二、
標註覆蓋物:
彈出窗覆蓋物:
三、實現過程
大部分是根據官方給的demo來的。
A、設定檔:
第一步:在工程裡建立libs檔案夾,將開發包裡的baidumapapi_vX_X_X.jar拷貝到libs根目錄下,將libBaiduMapSDK_vX_X_X.so拷貝到libs\armeabi目錄下(官網demo裡已有這兩個檔案,如果要整合到自己的工程裡,就需要自己添加),拷貝完成後的工程目錄如所示;
註:liblocSDK3.so和locSDK_3.1.jar為百度定位SDK所使用資源,開發人員可根據實際需求自行添加。
第二步:在工程屬性->Java Build Path->Libraries中選擇“Add External JARs”,選定baidumapapi_vX_X_X.jar,確定後返回。
通過以上兩步操作後,您就可以正常使用百度地圖SDK為您提供的全部功能了。
注意:由於adt外掛程式升級,若您使用Eclipse adt 22的話,需要對開發環境進行相應的設定,方法如下:
1. 在Eclipse 中選中工程,右鍵選 Properties->Java Build Path->Order and Export 使 Android Private Libraries處於勾選狀態;
2. Project -> clean-> clean all .
B、在AndroidManifest中添加開發密鑰、要求的權限等資訊;
<application <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="開發人員 key" /></application>
C、添加一些相應的許可權
<uses-permission android:name="android.permission.GET_ACCOUNTS" /><uses-permission android:name="android.permission.USE_CREDENTIALS" /><uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /><uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.BROADCAST_STICKY" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><ses-permission android:name="android.permission.READ_PHONE_STATE" />
D、在布局檔案中,加入百度地圖的自訂控制項
<com.baidu.mapapi.map.MapView android:id="@id/mapview_baidu_address" android:layout_width="match_parent" android:layout_height="match_parent" />
E、在應用程式建立時初始化 SDK引用的Context 全域變數
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件之前初始化context資訊,傳入ApplicationContext //注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); }}
注意:在SDK各功能組件使用之前都需要調用
SDKInitializer.initialize(getApplicationContext());,因此我們建議該方法放在Application的初始化方法中
F、建立地圖Activity
不同之前的版本,3.0版的sdk中,mapview對象需要先擷取BaiduMap對象才能由BaiduMap對象進行後續的添加覆蓋物的操作。
protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsetContentView(R.layout.d1_activity_address);super.onCreate(savedInstanceState);mMapView = (MapView) findViewById(R.id.mapview_baidu_address);mBaiduMap = mMapView.getMap();//擷取BaiduMap類 BaiduMap類才可以添加自訂的圖層MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);//設定地圖的縮放比例mBaiduMap.setMapStatus(msu);//將前面的參數交給BaiduMap類initOverLay(latitude, longitude);// 繪製圖層showPop();// 彈出popup}
管理地圖生命週期
@Overrideprotected void onPause() {// MapView的生命週期與Activity同步,當activity掛起時需調用MapView.onPause()mMapView.onPause();super.onPause();}@Overrideprotected void onResume() {// MapView的生命週期與Activity同步,當activity恢複時需調用MapView.onResume()mMapView.onResume();super.onResume();} @Override protected void onDestroy() { // MapView的生命週期與Activity同步,當activity銷毀時需調用MapView.destroy() mLocClient.stop(); // 關閉定位元影像層 mBaiduMap.setMyLocationEnabled(false); if (mMapView!=null) { mMapView.onDestroy(); mMapView = null; } // 回收 bitmap 資源 bitmap.recycle(); }
其中繪製覆蓋物,也就是圖層的方法代碼如下:
LatLng這個類 官方文檔的說明是:地理座標基本資料結構
public void initOverLay(double latitude, double longitude) {// 定義Maker座標點LatLng ll = new LatLng(latitude, longitude);// 構建Marker表徵圖BitmapDescriptor bd1 = BitmapDescriptorFactory.fromResource(R.drawable.pin_green);// 構建MarkerOption,用於在地圖上添加MarkerOverlayOptions option = new MarkerOptions().position(ll).icon(bd1);// 在地圖上添加Marker,並顯示mBaiduMap.addOverlay(option);//添加當前分店資訊圖層MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);mBaiduMap.setMapStatus(u);}
彈出窗覆蓋物 點擊覆蓋物,彈出導航挑選清單
public void showPop() {// 建立InfoWindow展示的viewView popup = View.inflate(this, R.layout.pop, null);TextView title = (TextView) popup.findViewById(R.id.tv_title);TextView content = (TextView) popup.findViewById(R.id.tv_content);title.setText(name);content.setText(addr);// 定義用於顯示該InfoWindow的座標點LatLng pt = new LatLng(latitude, longitude);//Point p = mBaiduMap.getProjection().toScreenLocation(pt);// 建立InfoWindow的點擊事件監聽者OnInfoWindowClickListener listener = new OnInfoWindowClickListener() {public void onInfoWindowClick() {// 添加點擊後的事件響應代碼Uri uri = Uri.parse("geo:" + latitude + "," + longitude + "");Intent it = new Intent(Intent.ACTION_VIEW, uri);startActivity(it);}};// 建立InfoWindowInfoWindow mInfoWindow = new InfoWindow(popup, pt, listener);// 顯示InfoWindowmBaiduMap.showInfoWindow(mInfoWindow);}
四、總結
利用百度地圖sdk開發的幾個步驟:
1、匯入jar包和so檔案
2、布局檔案中加入百度地圖控制項,manifest資訊清單檔中,加入響應的許可權,application節點下加入key
3、主activity中setContentView之前加入SDKInitializer.initialize(getApplicationContext());進行初始化
4、得到地圖mapView對象,然後進行其他動作
5、產生覆蓋物(見上面的代碼)
6、產生彈出窗覆蓋物 (見上面的代碼)