基於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();
}
}
效果圖
以上就是主要代碼了,還有一個實體類沒粘,因爲我太懶了,而且文章有點長,就不粘了,後面有項目源碼,不要分的,歡迎下載!
代碼寫的很爛的,靜態代碼塊那部分主要是爲了模擬從其他地方傳過來的地址信息,其中還有很多需要改進的地方,希望各位猿友指出批評,在此先謝過大家!