Android應用開發-------------百度地圖的配置和使用

博客爲 有時個哥 原創,如需轉載請標明出處:http://blog.csdn.net/ls703/article/details/41345321

本人知道文采不行,有些事情用文字表達的不算清楚,但我還是要堅持寫,不爲別人,只爲積累,以後回頭看看自己也能想起。

 

1.百度地圖的配置

首先要準備百度提供的sdk還有一個文件夾,如下圖放在libs文件加下,之所以有兩個架包是,一個是定位用的(locSdk),一個是地圖(baidumap)。如果只需要定位的話那就

只用定位的包就可以。還有上面的兩個so文件不要忘記也考進去。

然後就是在清單文件裏配置。

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

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
	<uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </permission>

    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
    </uses-permission>
    <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <!-- SDK1.5需要android.permission.GET_TASKS權限判斷本程序是否爲當前運行的應用? -->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.CAMERA" >
    </uses-permission>
    <uses-permission android:name="android.permission.RECORD_AUDIO" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!-- 來電消音 -->
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="false"
        android:resizeable="true"
        android:smallScreens="true" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:name="com.example.mapdemo.appl.MapApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
          <!-- 正式版bdmap key -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="BWm8Yvk6WAXfXs5B0mICtQC0" />
        <activity
            android:name="com.example.mapdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.mapdemo.activity.LocationActivity"></activity>
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>
    </application>

</manifest>

百度的sdk涉及到很多權限,爲了方便你就直接從官方demo裏吧全有的權限拷到清單文件裏就行了。在下面還有一個service不要忘記拷進去。

<service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>


這樣初始配置就完成了。記下來就是在應用裏開始初始化地圖,也就是相當於啓動sdk。一般這個實在application裏做的。因爲application是一個貫穿於整個生命週期的類,在應用啓動的時候會自動啓動。

package com.example.mapdemo.appl;

import android.app.Application;

import com.baidu.mapapi.SDKInitializer;

public class MapApplication extends Application {
 @Override
 public void onCreate() {
  super.onCreate();
  // 在使用 SDK 各組間之前初始化 context 信息,傳入 ApplicationContext
  System.out.println("=========");
  SDKInitializer.initialize(this);
  
 }
}


不過要注意,一般應用使用的是默認的application。所以你必須在清單文件裏改一下application的。上面的清單文件裏已經有了。即

上面在application下加一個屬性name,然後值爲你寫的繼承application的子類。

下面是百度所需要的key值。每個key是和應用包名綁定的,所以開發時需要到百度那裏自己申請key值。如果沒有key可能會出現其他問題。我這邊是地圖顯示不出來。獲得不到定位的地址等等。

然後就是使用了。我在開發中通過看官方demo,整理了一個activity,給他傳值,然後定位,獲得當前座標並在座標上面顯示圖層,圖層上有獲得當前的地址。key值不對的話只能定位,顯示地址的圖層是不會顯示的。下面是我的類的代碼。

package com.example.mapdemo.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.example.mapdemo.R;
/******************************************************************************
 * 思路: 進入,分兩種一個本人自己定位後發送, 一個是取得座標之後定位別人的位置,
 * 只要有參數傳入就是其他座標驚醒定位 如果沒有就默認自己當前位置定位
 ******************************************************************************/
public class LocationActivity extends Activity  {
	// this
	private LocationActivity INSTANCE;
	// 頭部佈局控件
	private Button btnBack;// 返回
	private TextView tvText;// 標題
	private TextView tvRight;// 發送

	// 百度地圖
	private MapView mMapView;// 地圖控件
	private BaiduMap mBaiduMap;// 百度地圖操作對象
	private LocationClient mLocClient;// 定位
	public MyLocationListenner myListener = new MyLocationListenner();// 監聽
	private boolean isFirstLoc = true;// 初次定位

	private LatLng llinfo;// 座標
	private String address="";// 地址

	private GeoCoder mSearch;
	private MyLocationData locData;

	String type = TYPE_MYLOCATON;

	private Marker marker;
	private static final String TYPE_MYLOCATON = "MY";
	private static final String TYPE_FRLOCATON = "FR";
	BitmapDescriptor bdA = BitmapDescriptorFactory
			.fromResource(R.drawable.icon_lbs_free);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.chat_share_location);
		//1.接受上一頁面傳入的座標
		Intent intent = getIntent();
		//2.座標存在,則記錄下當前座標,並設置當前定位的類型
		if (intent.hasExtra("lat") && intent.hasExtra("lat")) {
			//2.1 當用intent參數時,設置中心點爲指定點
			Bundle b = intent.getExtras();
			llinfo = new LatLng(b.getDouble("lat"), b.getDouble("lng"));
			type = TYPE_FRLOCATON;
		}
		// 3.初始化頭佈局
		initHeaderView();
		// 4.初始化地圖,
		initMaps();

	}

	// 初始化頭部佈局
	private void initHeaderView() {
		System.out.println("type::"+type);
		btnBack = (Button) findViewById(R.id.btnBack);
		tvText = (TextView) findViewById(R.id.tvText);
		tvRight = (TextView) findViewById(R.id.tvRight);
		tvRight.setVisibility(View.GONE);
		if(type==TYPE_MYLOCATON){
			tvRight.setVisibility(View.VISIBLE);
		}
		tvText.setText("地圖");
		btnBack.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		tvRight.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent=new Intent();  
	            intent.putExtra("lat", locData.latitude);  
	            intent.putExtra("lng", locData.longitude);  
	            intent.putExtra("addr", address);  
	            setResult(RESULT_OK, intent);  
	            finish(); 
				
			}
		});
		
	}


	private void initMaps() {
		mMapView = (MapView) findViewById(R.id.b_map);
		mBaiduMap = mMapView.getMap();
		// 開啓定位圖層
		mBaiduMap.setMyLocationEnabled(true);

		mSearch = GeoCoder.newInstance();
		mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {

			@Override
			public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
				if (result == null
						|| result.error != SearchResult.ERRORNO.NO_ERROR) {
					Toast.makeText(INSTANCE, "抱歉,未能找到結果", 1).show();
				} else {
					showAddress(marker, result.getAddress());
					address =  result.getAddress();
					System.out.println("address====="+address);
				}
			}

			@Override
			public void onGetGeoCodeResult(GeoCodeResult arg0) {

			}
		});
		// 定位初始化
		mLocClient = new LocationClient(this);
		mLocClient.registerLocationListener(myListener);
		LocationClientOption option = new LocationClientOption();
		option.setOpenGps(true);// 打開gps
		option.setCoorType("bd09ll"); // 設置座標類型
		option.setScanSpan(5000);
		mLocClient.setLocOption(option);
		mLocClient.start();

	}

	/**
	 * 定位SDK監聽函數
	 */
	public class MyLocationListenner implements BDLocationListener {
		@Override
		public void onReceiveLocation(BDLocation location) {
			// map view 銷燬後不在處理新接收的位置
			if (location == null || mMapView == null)
				return;

			if (type == TYPE_MYLOCATON) {
				locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())
						// 此處設置開發者獲取到的方向信息,順時針0-360
						.direction(100).latitude(location.getLatitude())
						.longitude(location.getLongitude()).build();

			} else {
				locData = new MyLocationData.Builder()
						.accuracy(location.getRadius())
						// 此處設置開發者獲取到的方向信息,順時針0-360
						.direction(100).latitude(llinfo.latitude)
						.longitude(llinfo.longitude).build();
			}
			setLocationShow(locData);
			// 顯示覆蓋圖層
			initOverlay(locData);
			// 得到地址
			getAddressStr(locData);
			// // 顯示地址
			 System.out.println("地址:::" + location.getAddrStr());
		}

		public void onReceivePoi(BDLocation poiLocation) {
		}
	}

	// 定位顯示
	private void setLocationShow(MyLocationData locData) {
		mBaiduMap.setMyLocationData(locData);
		if (isFirstLoc) {
			isFirstLoc = false;
			LatLng ll = new LatLng(locData.latitude, locData.longitude);
			MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
			mBaiduMap.animateMapStatus(u);
		}
	}

	// 添加圖層
	private void initOverlay(MyLocationData locData) {
		LatLng llInfo = new LatLng(locData.latitude, locData.longitude);
		OverlayOptions ooA = new MarkerOptions().position(llInfo).icon(bdA)
				.zIndex(9);
		marker = (Marker) (mBaiduMap.addOverlay(ooA));
	}

	// 顯示地址,
	private void showAddress(Marker marker, String address) {
		TextView view = new TextView(getApplicationContext());
		view.setBackgroundResource(R.drawable.bg_locationinfo);
		view.setText(address);
		view.setGravity(Gravity.CENTER);

		final LatLng ll = marker.getPosition();
		Point p = mBaiduMap.getProjection().toScreenLocation(ll);
		p.y -= 47;
		LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p);
		InfoWindow mInfoWindow = new InfoWindow(view, llInfo, null);
		mBaiduMap.showInfoWindow(mInfoWindow);
	}

	// 得到地址
	private void getAddressStr(MyLocationData locData) {
		LatLng ptCenter = new LatLng(locData.latitude, locData.longitude);
		// 反Geo搜索
		mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
	}

	/*************************************************************************/
	@Override
	protected void onPause() {
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onResume() {
		mMapView.onResume();
		super.onResume();
	}

	@Override
	protected void onDestroy() {
		// 退出時銷燬定位
		mLocClient.stop();
		mSearch.destroy();
		// 關閉定位圖層
		mBaiduMap.setMyLocationEnabled(false);
		mMapView.onDestroy();
		mMapView = null;
		bdA.recycle();
		super.onDestroy();
	}

}


下面是Demo的源碼:

http://download.csdn.net/detail/ls703/8183051


 


 

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