Android百度地圖使用之基本功能

jopen 11年前發布 | 23K 次閱讀 百度地圖 Android開發 移動開發

下面將陸續摘錄百度地圖的使用,本文先介紹百度地圖基本功能的使用,代碼原型來自百度Demo:

注意需要到百度地圖開放平臺申請key和下載相應jar包:http://developer.baidu.com/map/sdkandev-download.htm

Activity:

package com.home;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

import android.os.Bundle;
import android.widget.Toast;
import android.app.Activity;
import android.graphics.Bitmap;

/**
 * 演示MapView的基本用法
 * 
 * @author Administrator
 * 
 */
public class BaseMapActivity extends Activity {
    /**
     * MapView 是地圖主控件
     */
    private MapView mMapView = null;
    /**
     * 用MapController完成地圖控制
     */
    private MapController mMapController = null;
    /**
     * MKMapViewListener 用于處理地圖事件回調
     */
    MKMapViewListener mMapListener = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 使用地圖sdk前需先初始化BMapManager. BMapManager是全局的,可為多個MapView共用,它需要地圖模塊創建前創建,
         * 并在地圖地圖模塊銷毀后銷毀,只要還有地圖模塊在使用,BMapManager就不應該銷毀
         */
        DemoApplication app = (DemoApplication) this.getApplication();
        if (app.mBMapManager == null) {
            app.mBMapManager = new BMapManager(this);
            /**
             * 如果BMapManager沒有初始化則初始化BMapManager
             */
            app.mBMapManager.init(DemoApplication.strKey,
                    new DemoApplication.MyGeneralListener());
        }
        setContentView(R.layout.main);
        /**
         * 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后
         */
        setContentView(R.layout.main);
        mMapView = (MapView) findViewById(R.id.main_bmapView);
        /**
         * 獲取地圖控制器
         */
        mMapController = mMapView.getController();
        /**
         * 設置地圖是否響應點擊事件 .
         */
        mMapController.enableClick(true);
        /**
         * 設置地圖縮放級別
         */
        mMapController.setZoom(12);

        /**
         * 將地圖移動至指定點
         * 使用百度經緯度坐標,可以通過http://api.map.baidu.com/lbsapi/getpoint/index
         * .html查詢地理坐標 如果需要在百度地圖上顯示使用其他坐標系統的位置,請發郵件至mapapi@baidu.com申請坐標轉換接口
         */
        double cLat = 30.67;
        double cLon = 104.10;
        // 設置中心點為成都市成華區
        GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6));
        mMapController.setCenter(p);
        // 用于處理地圖事件回調
        mMapListener = new MKMapViewListener() {
            @Override
            public void onMapMoveFinish() {
                /**
                 * 在此處理地圖移動完成回調 縮放,平移等操作完成后,此回調被觸發
                 */
            }

            @Override
            public void onClickMapPoi(MapPoi mapPoiInfo) {
                /**
                 * 在此處理底圖poi點擊事件 顯示底圖poi名稱并移動至該點 設置過:
                 * mMapController.enableClick(true),此回調才能被觸發
                 * 
                 */
                String title = "";
                if (mapPoiInfo != null) {
                    title = mapPoiInfo.strText;
                    Toast.makeText(BaseMapActivity.this, title,
                            Toast.LENGTH_SHORT).show();
                    mMapController.animateTo(mapPoiInfo.geoPt);
                }
            }

            @Override
            public void onGetCurrentMap(Bitmap b) {
                /**
                 * 當調用過 mMapView.getCurrentMap()后,此回調會被觸發 可在此保存截圖至存儲設備
                 */
            }

            @Override
            public void onMapAnimationFinish() {
                /**
                 * 地圖完成帶動畫的操作(如: animationTo())后,此回調被觸發
                 */
            }

            /**
             * 在此處理地圖加載完成事件
             */
            @Override
            public void onMapLoadFinish() {
                Toast.makeText(BaseMapActivity.this, "地圖加載完成!",
                        Toast.LENGTH_SHORT).show();

            }
        };
        mMapView.regMapViewListener(DemoApplication.getInstance().mBMapManager,
                mMapListener);
    }

    @Override
    protected void onPause() {
        /**
         * MapView的生命周期與Activity同步,當activity掛起時需調用MapView.onPause()
         */
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        /**
         * MapView的生命周期與Activity同步,當activity恢復時需調用MapView.onResume()
         */
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        /**
         * MapView的生命周期與Activity同步,當activity銷毀時需調用MapView.destroy()
         */
        mMapView.destroy();
        super.onDestroy();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mMapView.onRestoreInstanceState(savedInstanceState);
    }
}

Application:

package com.home;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;

import android.app.Application;
import android.content.Context;
import android.widget.Toast;

public class DemoApplication extends Application {
    private static DemoApplication mInstance = null;
    BMapManager mBMapManager = null;
    public static final String strKey = "0B0d1233eec3932c2273b4da82b27e36";

    /*
     * 注意:為了給用戶提供更安全的服務,Android SDK自v2.1.3版本開始采用了全新的Key驗證體系。
     * 因此,當您選擇使用v2.1.3及之后版本的SDK時,需要到新的Key申請頁面進行全新Key的申請, 申請及配置流程請參考開發指南的對應章節
     */
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        initEngineManager(this);
    }

    public static DemoApplication getInstance() {
        return mInstance;
    }

    public void initEngineManager(Context context) {
        if (mBMapManager == null) {
            mBMapManager = new BMapManager(context);
        }

        if (!mBMapManager.init(strKey, new MyGeneralListener())) {
            Toast.makeText(
                    DemoApplication.getInstance().getApplicationContext(),
                    "BMapManager  初始化錯誤!", Toast.LENGTH_LONG).show();
        }
    }

    // 常用事件監聽,用來處理通常的網絡錯誤,授權驗證錯誤等
    static class MyGeneralListener implements MKGeneralListener {

        @Override
        public void onGetNetworkState(int iError) {
            if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
                Toast.makeText(
                        DemoApplication.getInstance().getApplicationContext(),
                        "網絡出錯!", Toast.LENGTH_LONG).show();
            } else if (iError == MKEvent.ERROR_NETWORK_DATA) {
                Toast.makeText(
                        DemoApplication.getInstance().getApplicationContext(),
                        "輸入正確的檢索條件!", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onGetPermissionState(int iError) {
            if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
                // 授權Key錯誤:
                Toast.makeText(
                        DemoApplication.getInstance().getApplicationContext(),
                        "請輸入正確的授權Key!", Toast.LENGTH_LONG).show();
            }
        }
    }
}

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.home"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />
    <!-- 使用網絡功能所需權限 -->
    <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>

    <!--
             添加屏幕支持
      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" />

    <application
        android:name="com.home.DemoApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.home.BaseMapActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

布局XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.baidu.mapapi.map.MapView
        android:id="@+id/main_bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />

</LinearLayout>

附上圖片效果:

20130901201455609.jpeg

來自:http://blog.csdn.net/u010142437/article/details/10553965

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!