Android百度地圖3.5.0 定位與覆蓋物的添加(Location and Overlay)

基於Android SDK v3.5.0的百度地圖定位與覆蓋物的添加。

先申請key http://lbsyun.baidu.com/apiconsole/key (先註冊百度賬號)
接着添加jar包 按照這個步驟來http://developer.baidu.com/map/index.php?title=androidsdk/guide/buildproject
(以上兩步和以前的版本一模一樣,我實在是懶得寫了,有一點是jar包我直接放在libs下面,沒有進行任何BuildingPath添加,直接出現在了Android Private Libraries中,然後就直接可以用了)
然後在清單配置文件裏添加
一個是申請的key值,一個是定位服務

<application>  
     <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者申請的key值" />  
     <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
     </service>


    ....
</application>`

權限

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-permission android:name="android.permission.CHANGE_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.INTERNET" />  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
    <uses-permission android:name="android.permission.READ_LOGS" />  

XML文件

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

初始化百度地圖

SDKInitializer.initialize(this);

這句話寫在Application(推薦)和MainActivity中都可以,但是要在setContentView()之前
例:

public class MyApplication extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(this);
    }
}
或者
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注意該方法要再setContentView方法之前實現
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        ....
}

準備工作結束,接下來是正文!

//OnGetGeoCoderResultListener這個地理編碼的監聽既可以實現接口,也可以setlistener 內部匿名類實現
public class MainActivity extends Activity implements OnGetGeoCoderResultListener{
    public MapView mapView = null;
    public BaiduMap baiduMap = null;
    GeoCoder search = null;
    // 定位相關聲明
    public LocationClient locationClient = null;
    //自定義圖標
    boolean isFirstLoc = true;// 是否首次定位
    private static String city = "深圳市";
    private static String addr1 = "深圳大學";
    private static String addr2 = "維用大廈";
    private static String addr3 = "桑達科技大廈";
    private static String addr4 = "科苑西小區 ";
    private static String addr5 = "科技工業大廈";
    private static List<infoEntity> infoList = new ArrayList<infoEntity>();
    static {
        infoList.add(new infoEntity(city, addr1));
        infoList.add(new infoEntity(city, addr2));
        infoList.add(new infoEntity(city, addr3));
        infoList.add(new infoEntity(city, addr4));
        infoList.add(new infoEntity(city, addr5));
    }

    public BDLocationListener myListener = new BDLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // mapview 銷燬後不在處理新接收的位置
            if (location == null || mapView == null)
                return;
            MyLocationData locData = new MyLocationData.Builder()
            .accuracy(location.getRadius())
            // 此處設置開發者獲取到的方向信息,順時針0-360
            .direction(100).latitude(location.getLatitude())
            .longitude(location.getLongitude()).build();
            baiduMap.setMyLocationData(locData);    //設置定位數據
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16);   //設置地圖中心點以及縮放級別
                baiduMap.animateMapStatus(u);
            }
            // 遍歷集合多次監聽 添加覆蓋物
            for(int i=0;i<infoList.size();i++){
                search = GeoCoder.newInstance();
                search.setOnGetGeoCodeResultListener(MainActivity.this);
                //這是一個自己寫的實體類 只包含兩個參數 String city 和String address
                infoEntity entity = infoList.get(i);
                String c = entity.getCity();
                String a = entity.getAddress();
                search.geocode(new GeoCodeOption().city(c).address(a));
            }
        } 

    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        // 注意該方法要再setContentView方法之前實現
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);

        mapView = (MapView) this.findViewById(R.id.id_bmapView); // 獲取地圖控件引用
        mapView.removeViewAt(1);   //刪除百度地圖Logo(若作爲商用軟件最好不要刪除logo,百度會追責)
        //獲取地圖控制器
        baiduMap = mapView.getMap();
        //設置地圖初始縮放
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f);
        baiduMap.setMapStatus(msu);
        //開啓定位圖層
        baiduMap.setMyLocationEnabled(true);

        locationClient = new LocationClient(getApplicationContext()); // 實例化LocationClient類
        locationClient.registerLocationListener(myListener); // 註冊監聽函數
        setLocationOption();   //設置定位參數
        locationClient.start(); // 開始定位

    }
    //反地理編碼(座標->地址)
    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
    }
    //地理編碼 (地址->座標)
    @Override
    public void onGetGeoCodeResult(GeoCodeResult result) {
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(MainActivity.this, "抱歉,未能找到結果", Toast.LENGTH_LONG)
            .show();
            return;
        }
        //添加覆蓋物
        baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.icon2)));
    }
    private void setLocationOption() {
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打開GPS
        option.setServiceName("com.baidu.location.service_v2.9");//這一句加和不加好像都行,可能新版本內置了
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 設置定位模式
        option.setCoorType("bd09ll"); // 返回的定位結果是百度經緯度,默認值gcj02
        option.setScanSpan(5000); // 設置發起定位請求的間隔時間爲5000ms
        option.setIsNeedAddress(true); // 返回的定位結果包含地址信息
        option.setNeedDeviceDirect(true); // 返回的定位結果包含手機機頭的方向

        locationClient.setLocOption(option);        
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        locationClient.stop();
        // 關閉定位圖層
        baiduMap.setMyLocationEnabled(false);
        mapView.onDestroy();
    }

}

效果圖
圖片有點大啊。。。

以上就是主要代碼了,還有一個實體類沒粘,因爲我太懶了,而且文章有點長,就不粘了,後面有項目源碼,不要分的,歡迎下載!

代碼寫的很爛的,靜態代碼塊那部分主要是爲了模擬從其他地方傳過來的地址信息,其中還有很多需要改進的地方,希望各位猿友指出批評,在此先謝過大家!

點擊下載項目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章