android菜鳥學習筆記30----Android使用百度地圖API(一)準備工作及在應用中顯示地圖,android百度地圖api

來源:互聯網
上載者:User

android菜鳥學習筆記30----Android使用百度地圖API(一)準備工作及在應用中顯示地圖,android百度地圖api

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       @Override20 21       protected void onResume() {22 23            // TODO Auto-generated method stub24 25            super.onResume();26 27            mv.onResume();28 29       }30 31       @Override32 33       protected void onPause() {34 35            // TODO Auto-generated method stub36 37            super.onPause();38 39            mv.onPause();40 41       }42 43       @Override44 45       protected void onDestroy() {46 47            // TODO Auto-generated method stub48 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     <Button10 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     <Button24 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     <Button40 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     <Button56 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     <Button72 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 stub12 13                       mv.setScaleControlPosition(new Point(20,20));14 15                    mv.setZoomControlsPosition(new Point(150,50));16 17                  }18 19 });

運行結果:

 

果然生效了……汗,協助文檔敢不敢再模糊點兒,還要自己摸索……

先學到這……

畢竟周末了,下午先去看個電影,其他的API晚上回來再接著學習……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.