1.准備工作:
百度地圖API是免費開放的,但是需要申請API Key:
1)先注冊一個百度開發者帳號
2)進入百度開放服務平台http://developer.baidu.com/
3)進入LBS雲
4)點擊右上角的API控制台,沒有登錄的話會先跳轉到登錄頁面,登錄成功之后就進入應用控制台了:
5)點擊創建應用:
應用類型選擇Android SDK,注意下面的安全碼,格式是數字簽名+應用包名,中間用分號分隔。數字簽名的獲得:
Eclipse中window->Preferences->Android->build:找到SHA1 fingerprint那一欄:
把后面的一長串復制出來就行了,測試就用這個數字簽名。
然后是應用包名,隨便給即將用到百度地圖API的應用取個包名就好了,我取的是cn.csc.bm,兩個拼接起來就是安全碼了:
B0:B1:CA:82:82:AC:84:0A:73:56:56:12:C6:C8:BB:08:3C:93:FE:04;cn.csc.bm,然后點擊提交:
這個就是上面安全碼對應的API Key了。
獲取API Key之后,就需要下載百度地圖SDK了:
百度地圖SDK升級到v3.5.0與之前2.x的使用有些不同,更加簡便了。
到相關下載中下載即可:
根據需要選擇下載內容,我這里直接點擊了一鍵下載。
下載后的壓縮包中:
Docs是幫助文檔
Lib是使用百度地圖API時需要引入的類庫
Sample是一些API使用的示例
解壓Lib包
把jar包復制到項目的libs目錄下,右擊這個jar包:
將其添加到build path中
進入so目錄把不同CPU版本的鏈接庫連同目錄一起復制到項目的libs目錄下
如armeabi,則將目錄連同里面的so鏈接庫都復制到libs目錄下,然后就可以在arm的模擬器上運行,這時,要注意的是:如果模擬器采用的CPU是x86的就會出現錯誤:
因為so鏈接庫是用c/c++寫的,然后根據特定的CPU平台編譯為特定的版本,不同cpu的機器指令不同,肯定不能通用。這時,就應當把x86目錄復制到libs目錄。
這時,arm和x86的模擬器都能正常使用百度API了:
5554使用的是arm的CPU,5556使用的是X86cpu,都能正常運行。
2.在應用中使用百度地圖API:
新版本的百度地圖SDK的使用方式與之前的采用BMapManager的方式有所不同,具體操作如下:
1)在清單文件中application節點中添加開發密鑰,即上面申請的API Key:
1 <application> 2 3 <meta-data 4 5 android:name="com.baidu.lbsapi.API_KEY" 6 7 android:value="API key" /> 8 9 </application>
2)在清單文件中添加百度地圖SDK所用到的權限:
1 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 2 3 <uses-permission android:name="android.permission.INTERNET"/> 4 5 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> 6 7 <uses-permission android:name="android.permission.WAKE_LOCK"/> 8 9 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 10 11 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 12 13 <uses-permission android:name="android.permission.GET_TASKS" /> 14 15 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 16 17 <uses-permission android:name="android.permission.WRITE_SETTINGS" />
3)在布局文件中添加顯示地圖的控件:
1 <com.baidu.mapapi.map.MapView 2 3 android:id="@+id/mv" 4 5 android:layout_width="match_parent" 6 7 android:layout_height="match_parent" 8 9 android:clickable="true" />
4)在應用程序創建時初始化 SDK引用的Context 全局變量:
1 public class MainActivity extends Activity { 2 3 @Override 4 5 protected void onCreate(Bundle savedInstanceState) { 6 7 super.onCreate(savedInstanceState); 8 9 SDKInitializer.initialize(getApplicationContext()); 10 11 setContentView(R.layout.activity_main); 12 13 } 14 15 }
注意,初始化工作一定要在setContentView()之前完成,因為初始化工作中會自動獲取布局文件中的MapView()進行填充,之后加載布局文件才能正常顯示地圖。
這樣,就能在應用中顯示百度地圖了,但是出於資源等方面的考慮,還需要將地圖控件的生命周期與Activity生命周期進行綁定:
5)修改MainActivity.java代碼:
1 public class MainActivity extends Activity { 2 3 private MapView mv; 4 5 @Override 6 7 protected void onCreate(Bundle savedInstanceState) { 8 9 super.onCreate(savedInstanceState); 10 11 SDKInitializer.initialize(getApplicationContext()); 12 13 setContentView(R.layout.activity_main); 14 15 mv = (MapView) findViewById(R.id.mv); 16 17 } 18 19 @Override 20 21 protected void onResume() { 22 23 // TODO Auto-generated method stub 24 25 super.onResume(); 26 27 mv.onResume(); 28 29 } 30 31 @Override 32 33 protected void onPause() { 34 35 // TODO Auto-generated method stub 36 37 super.onPause(); 38 39 mv.onPause(); 40 41 } 42 43 @Override 44 45 protected void onDestroy() { 46 47 // TODO Auto-generated method stub 48 49 super.onDestroy(); 50 51 mv.onDestroy(); 52 53 } 54 55 }
在Activity對應的生命周期回調方法中調用MapView的對應方法即可。
6)運行結果:
上面這個簡單的程序中只用到了兩個類:
用於初始化 SDK context 全局變量,指定 sdcard 路徑
常用方法:
用於初始化上下文環境,必須在用到百度地圖SDK各個組件如MapView之前被調用。
MapView繼承自ViewGroup。
方法有:
因為繼承自ViewGroup,所以有addView()和removeView()方法,可以用來添加個刪除子控件。
onDestroy()、onPause()、onResume()分別對應生命周期的回調。
showScaleControl(boolean)和showZoomControls(boolean)用於控制是否顯示比例尺控件及縮放控件
setScaleControlPosition()和setZoomControlsPosition()用於設置這兩個控件的顯示位置
getMap()用於獲取地圖控制器對象。
簡單測試下幾個方法的效果:
1)addView():
新建一個direction.xml的布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:layout_width="match_parent" 6 7 android:layout_height="match_parent" > 8 9 <Button 10 11 android:id="@+id/btn_cent" 12 13 android:layout_width="wrap_content" 14 15 android:layout_height="wrap_content" 16 17 android:text="中" 18 19 android:layout_centerInParent="true" 20 21 /> 22 23 <Button 24 25 android:id="@+id/btn_up" 26 27 android:layout_width="wrap_content" 28 29 android:layout_height="wrap_content" 30 31 android:text="上" 32 33 android:layout_above="@id/btn_cent" 34 35 android:layout_alignLeft="@id/btn_cent" 36 37 /> 38 39 <Button 40 41 android:id="@+id/btn_down" 42 43 android:layout_width="wrap_content" 44 45 android:layout_height="wrap_content" 46 47 android:text="下" 48 49 android:layout_below="@id/btn_cent" 50 51 android:layout_alignLeft="@id/btn_cent" 52 53 /> 54 55 <Button 56 57 android:id="@+id/btn_left" 58 59 android:layout_width="wrap_content" 60 61 android:layout_height="wrap_content" 62 63 android:text="左" 64 65 android:layout_toLeftOf="@id/btn_cent" 66 67 android:layout_alignTop="@id/btn_cent" 68 69 /> 70 71 <Button 72 73 android:id="@+id/btn_down" 74 75 android:layout_width="wrap_content" 76 77 android:layout_height="wrap_content" 78 79 android:text="上" 80 81 android:layout_toRightOf="@id/btn_cent" 82 83 android:layout_alignTop="@id/btn_cent" 84 85 /> 86 87 </RelativeLayout>
用於顯示上中下左右五個按鈕
修改MainActivity.java:
1 protected void onCreate(Bundle savedInstanceState) { 2 3 super.onCreate(savedInstanceState); 4 5 SDKInitializer.initialize(getApplicationContext()); 6 7 setContentView(R.layout.activity_main); 8 9 mv = (MapView) findViewById(R.id.mv); 10 11 View view = getLayoutInflater().from(this).inflate(R.layout.direction, null); 12 13 Builder builder = new MapViewLayoutParams.Builder(); 14 15 MapViewLayoutParams params = builder.point(new Point(100,450)).width(300).height(300).build(); 16 17 mv.addView(view,params); 18 19 }
注意:addView()方法的第二個參數必須是MapViewLayoutParams類型的,查看說明文檔該類型的實例可以通過其內部類Builder設置各種屬性,並最終創建出。
如:上面代碼中通過MapViewLayoutParams.Builder對象設置了子控件顯示位置、寬度、高度等,最后調用build()方法獲取MapViewLayoutParams對象。
運行結果:
可以看到,自定義的控件被放在地圖之上了,雖然這個控件沒有任何作用。
2)showZoomControls():
默認是顯示這個控件的,不需要時,可以調用該方法傳入false即可。
3)showScaleControl():
默認顯示,就是上面那個5公里的東東,要不顯示就調用該方法,傳入false。
4)修改控件的顯示位置:
setZoomControlsPosition();
setScaleControlPosition();
但是,直接調用:
mv.setScaleControlPosition(new Point(20,20));
mv.setZoomControlsPosition(new Point(150,50));
位置並沒有發生改變,文檔中說明:
這個onMapLoaFinish到底在哪呢……
MapView中沒有這個方法,只好先擱置,測試下一個方法:
5)getMap():
用於獲取地圖控制器。
BaiduMap map = mv.getMap();//返回類型是BaiduMap,與之前的版本的控制器有所不同。
BaiduMap這個類的方法很多,看來要慢慢學下,但是,在幫助文檔中注意到這樣一個方法,現在應該能用到:
設置地圖加載完成的回調,上面那個設置位置的方法說是要在地圖加載完成之后生效,是不是就要在這個回調里設置,簡單測試下:
1 BaiduMap map = mv.getMap(); 2 3 map.setOnMapLoadedCallback(new OnMapLoadedCallback() { 4 5 6 7 @Override 8 9 public void onMapLoaded() { 10 11 // TODO Auto-generated method stub 12 13 mv.setScaleControlPosition(new Point(20,20)); 14 15 mv.setZoomControlsPosition(new Point(150,50)); 16 17 } 18 19 });
運行結果:
果然生效了……汗,幫助文檔敢不敢再模糊點兒,還要自己摸索……
先學到這……
畢竟周末了,下午先去看個電影,其他的API晚上回來再接着學習……