編輯:Android開發實例
最近在研究百度地圖的API使用,在使用過程中遇到些問題,有些心得吧,記錄下來,希望能幫助到在項目中用到百度地圖的朋友。
一、開發前的准備工作:
1、注冊百度賬號,並登錄。(有百度賬號的話直接登錄)
2、申請Key,地址:http://developer.baidu.com/map/android-mobile-apply-key.htm
注:經研究發現在申請KEY時,應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)這樣,生成的API密鑰後面才可用。其他格式的也可以生成API密鑰,但是在使用過程中會出問題。(比如:一開始就報授權Key錯誤,或者使用一段時間後就不行了)
3、下載SDK(v2.0.0),地址:http://developer.baidu.com/map/sdkandev-download.htm
注:下載Android SDKv2.0.0 (矢量地圖版),裡面有BaiduMap_AndroidSDK_v2.0.0_Lib.zip、BaiduMap_AndroidSDK_v2.0.0_Docs.zip和BaiduMap_AndroidSDK_v2.0.0_Sample.zip三個壓縮包。
二、搭建開發環境,開始The world, hello(世界,你好)之旅:
1、創建android項目,在選SDK時(Choose an SDK to target),選的不是Google APIs,是不帶地圖服務的SDK 。
2、在項目創建完畢,在工程裡新建libs文件夾,將開發包(BaiduMap_AndroidSDK_v2.0.0_Lib.zip)裡的baidumapapi_v2_0_0.jar拷貝到libs根目錄下,將libBMapApiEngine_v2_0_0.so和libvi_voslib.so 拷貝到libs\armeabi目錄下,拷貝完成後的工程目錄如下圖所示:
3、在AndroidManifest.xml文件中添加使用權限:
- <!-- 使用網絡功能所需權限 -->
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
- </uses-permission>
- <uses-permission android:name="android.permission.INTERNET" >
- </uses-permission>
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
- </uses-permission>
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
- </uses-permission>
- <!-- 讀取手機的當前狀態權限,沒有的話會報錯,這個是使用百度地圖API必須的 -->
- <uses-permission android:name="android.permission.READ_PHONE_STATE" >
- </uses-permission>
- <!--Cache功能需要讀寫外部存儲器 ,若沒這個權限,地圖加載不出來-->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
- </uses-permission>
4、添加對多種屏幕的支持:
- <!--
- 添加屏幕支持
- android:anyDensity="true"
- 這個屬性指明應用程序是否包含了能夠適用於任何屏幕密度的資源。
- 對於支持Android1.6(API Level 4)和更高版本的應用程序,這個屬性的默認值是true,
- 並且除非絕對的確認這是應用程序正常工作所必須的,否則不應該把它設置為false。
- 只是在應用程序直接操作位圖時才需要禁止這個屬性。
- android:largeScreens="true"
- 這個屬性用於指示應用程序是否支持較大外形的屏幕。
- 一個large類型的屏幕被定義成一個比normal類型的手持設備的屏幕明顯還要大的屏幕,
- 並且為了讓應用程序能夠良好的使用,使用這個屬性時要特別小心,盡管可以依賴系統來調整尺寸,
- 以便能夠填充屏幕。
- 這個屬性的默認值實際上在某些版本之間是不同的,因此最好在任何時候都明確的聲明這個屬性。
- 如果設置為false,系統會啟用屏幕兼容模式,這時要格外的小心。
- android:normalScreens="true"
- 這個屬性用於指示應用程序是否支持普通外形的屏幕。
- 典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被認為是普通屏幕。
- 這個屬性的默認值是true。
- android:smallScreens="true"
- 這個屬性用於指定應用程序是否支持較小外形的屏幕。
- 一個small類型的屏幕被定義成一個比normal(傳統的HVGA)類型的屏幕還要小的屏幕。
- 外部服務(如Google Play)不會把不支持小屏的應用程序提供給小屏設備,
- 因為很少有能夠確保該應用程序在小屏幕的設備上正常工作的平台。這個屬性的默認值是true。
- android:resizeable="true"
- 這個屬性用於指示針對不同的屏幕尺寸,應用程序是否可以調整尺寸。默認值是true。
- -->
- <supports-screens
- android:anyDensity="true"
- android:largeScreens="true"
- android:normalScreens="true"
- android:resizeable="true"
- android:smallScreens="true" />
5、配置Activity:
- <activity
- android:configChanges="orientation|keyboardHidden"
- android:label="@string/app_name"
- android:name=".BaiduMapBaseActivity"
- android:screenOrientation="sensor" >
- <intent-filter >
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
6、在布局xml文件中添加地圖控件:
- <com.baidu.mapapi.map.MapView
- android:id="@+id/bmapsView"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:clickable="true" />
7、 創建地圖Activity,並import相關類:
a. 創建地圖引擎管理類對象,並初始化。
- // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯
- mBMapManager = new BMapManager(this.getApplicationContext());
- mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {
- @Override
- public void onGetNetworkState(int iError) {
- if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
- Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
- "您的網絡出錯啦!", Toast.LENGTH_LONG).show();
- }
- }
- @Override
- public void onGetPermissionState(int iError) {
- if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
- // 授權Key錯誤:
- Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
- "請在 DemoApplication.java文件輸入正確的授權Key!", Toast.LENGTH_LONG).show();
- }
- }
- });
b.通過ID獲取代表地圖顯示組件的MapView對象,並設置啟用內置的縮放控件。
- mMapView = (MapView) this.findViewById(R.id.bmapsView);
- // 設置啟用內置的縮放控件
- mMapView.setBuiltInZoomControls(true);
c.獲取地圖控制器對象,並設置地圖的中心點及縮放級別。
- // 獲取地圖控制器,可以用它控制平移和縮放
- MapController mMapController = mMapView.getController();
- // 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
- // 北京天安門的經緯度:39.915 * 1E6,116.404 * 1E6
- // GeoPoint mGeoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
- // 上海市浦東新區的GPS緯度經度值:31.224078,121.540419
- GeoPoint mGeoPoint = new GeoPoint(
- (int) (31.224078 * 1E6),
- (int) (121.540419 * 1E6));
- // 設置地圖的中心點
- mMapController.setCenter(mGeoPoint);
- // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。
- mMapController.setZoom(13);
d.重寫Activity的生命周期回調方法onResume()、onPause()和onDestroy(),管理地圖引擎管理類對象和顯示對象生命周期。
- @Override
- protected void onResume() {
- mMapView.onResume();
- if (mBMapManager != null) {
- mBMapManager.start();
- }
- super.onResume();
- }
- @Override
- protected void onPause() {
- mMapView.onPause();
- if (mBMapManager != null) {
- mBMapManager.stop();
- }
- super.onPause();
- }
- @Override
- protected void onDestroy() {
- mMapView.destroy();
- if (mBMapManager != null) {
- mBMapManager.destroy();
- mBMapManager = null;
- }
- super.onDestroy();
- }
經過以上這些步驟,加載的是上海市浦東新區地圖(基礎圖),運行工程效果圖如下:
注:基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。
e.在地圖中顯示實時交通信息示圖(當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。)
- // 在地圖中顯示實時交通信息示
- mMapView.setTraffic(true);
運行效果圖如下:
f.顯示衛星圖(衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。)
- // 顯示衛星圖
- mMapView.setSatellite(true);
運行效果圖如下:
- package com.android.baidu.map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.Toast;
- import com.baidu.mapapi.BMapManager;
- import com.baidu.mapapi.MKGeneralListener;
- import com.baidu.mapapi.map.MKEvent;
- import com.baidu.mapapi.map.MapController;
- import com.baidu.mapapi.map.MapView;
- import com.baidu.platform.comapi.basestruct.GeoPoint;
- /**
- * 基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。
- * @author android_ls
- *
- */
- public class BaiduMapBaseActivity extends Activity {
- /**地圖引擎管理類*/
- private BMapManager mBMapManager = null;
- /**顯示地圖的View*/
- private MapView mMapView = null;
- /**
- * 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。
- * 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。
- * */
- public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯
- mBMapManager = new BMapManager(this.getApplicationContext());
- mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {
- @Override
- public void onGetNetworkState(int iError) {
- if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
- Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
- "您的網絡出錯啦!",
- Toast.LENGTH_LONG).show();
- }
- }
- @Override
- public void onGetPermissionState(int iError) {
- if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
- // 授權Key錯誤:
- Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
- "請在 DemoApplication.java文件輸入正確的授權Key!",
- Toast.LENGTH_LONG).show();
- }
- }
- });
- setContentView(R.layout.main);
- mMapView = (MapView) this.findViewById(R.id.bmapsView);
- // 設置啟用內置的縮放控件
- mMapView.setBuiltInZoomControls(true);
- // 獲取地圖控制器,可以用它控制平移和縮放
- MapController mMapController = mMapView.getController();
- // 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
- // 北京天安門的經緯度:39.915 * 1E6,116.404 * 1E6
- /* GeoPoint mGeoPoint = new GeoPoint(
- (int) (39.915 * 1E6),
- (int) (116.404 * 1E6));*/
- // 上海市浦東新區的GPS緯度經度值:31.224078,121.540419
- GeoPoint mGeoPoint = new GeoPoint(
- (int) (31.224078 * 1E6),
- (int) (121.540419 * 1E6));
- // 設置地圖的中心點
- mMapController.setCenter(mGeoPoint);
- // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。
- mMapController.setZoom(13);
- // 當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。
- // 在地圖中顯示實時交通信息示
- // mMapView.setTraffic(true);
- // 衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。
- // 顯示衛星圖,屏掉 mMapView.setTraffic(true);這行代碼。
- mMapView.setSatellite(true);
- }
- // 重寫以下方法,管理API
- @Override
- protected void onResume() {
- mMapView.onResume();
- if (mBMapManager != null) {
- mBMapManager.start();
- }
- super.onResume();
- }
- @Override
- protected void onPause() {
- mMapView.onPause();
- if (mBMapManager != null) {
- mBMapManager.stop();
- }
- super.onPause();
- }
- @Override
- protected void onDestroy() {
- mMapView.destroy();
- if (mBMapManager != null) {
- mBMapManager.destroy();
- mBMapManager = null;
- }
- super.onDestroy();
- }
- }
轉自:http://blog.csdn.net/android_ls/article/details/8577725
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩