(一)配置環境步驟:
官網幫助:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
1、新建工程
2、往libs裏導包
3、在application中添加開發密鑰
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="開發者 key" />
</application>
value爲在百度開發平臺上輸入SHA1和報名後獲得的密鑰
獲取SHA1步驟:
a、eclipse下:
windows–preference–android–build
b、studio下
terminal—->cd 到debug.keystore文件目錄下(如果studio不在
c盤,從安裝目錄轉不到此文件目錄,此時可以在dos下cd到此目錄)–>輸入keytool命令(keytool -list -v -keystore debug.keystore)–>輸入口令:android(只管輸入,不顯示)–>找到SHA1
注意:
(1)把項目下的debug.keyStore刪除,兩個勾取消
(2)build.gradle下的singingConfigs注掉(在SdkVersion下面)
包名:
爲Manifes下的package值
4、添加權限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
5、在佈局xml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
6、在應用程序創建時初始化 SDK引用的Context 全局變量:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
}
}
注意:在SDK各功能組件使用之前都需要調用
SDKInitializer.initialize(getApplicationContext());,因此我們建議該方法放在Application的初始化方法中**
(1)寫一個MapDataApp類繼承Application,
在onCreate方法裏寫該方法
public class MapDataApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 在使用SDK各組件之前初始化context信息,傳入ApplicationContext
// 注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
}
}
(2)給Manifest文件下的application添加name屬性
<application
android:name="com.sign.days26baidumapwork.MapDataApp"
備註:
所用到的類:
(1)MapView 一個顯示地圖的視圖(View)。它負責從服務端獲取地圖數據。它將會捕捉屏幕觸控手勢事件。 使用這個類必須按照它的生命週期進行操控,你必須參照以下方法onCreate(Bundle)、 onResume()、onPause()、onDestroy()。等聲明週期函數。在使用地圖組件之前請確保已經調用了 SDKInitializer.initialize(Context) 函數以提供全局 Context 信息。
(2)BaiduMap 定義 BaiduMap 地圖對象的操作方法與接口
(3)MapStatus 定義地圖狀態 如(overlook 俯視角度;zoom 縮放倍距; rotate 旋轉角度)
(4)BaiduMapOptions MapView初始化選項
(5)SupportMapFragment 管理地圖生命週期 方法: newInstance(BaiduMapOptions options)根據給定的百度地圖選項創建一個SupportMapFragment 實例
(6)
MapStatusUpdate 描述地圖狀態將要發生的變化
MapStatusUpdateFactory 生成地圖狀態將要發生的變化
MapStatusUpdate latlng = MapStatusUpdateFactory.newLatLng(ll);
fm.getBaiduMap().setMapStatus(latlng);
(7)OverlayOptions 地圖覆蓋物選型基類
Direct Known Subclasses:
ArcOptions, CircleOptions, DotOptions, GroundOverlayOptions, MarkerOptions, PolygonOptions, PolylineOptions, TextOptions
用於在地圖上添加覆蓋物,並設置覆蓋物的相關屬性
(8)class Stroke 邊框類,可以給圓、多邊形設置一個邊框
構造函數 int strokeWidth 邊框的寬度, 單位:像素, int color 邊框的顏色
(9)infoWindow 在地圖中顯示一個信息窗口,可以設置一個View作爲該窗口的內容,也可以設置一個 BitmapDescriptor 作爲該窗口的內容。
構造方法參數:view - InfoWindow 展示的 view;position - InfoWindow 顯示的地理位置;yOffset - InfoWindow Y 軸偏移量(方向 +向下,-向上)
(二)設置WelcomeActivity
開始界面顯示一個ListView,通過點擊ListView的條目,跳轉到不同的Activity
public class WelcomeActivity extends Activity {
private ListView lvShow = null;
private BaiduDemo[] baiduDemos = new BaiduDemo[] {
new BaiduDemo("sdk Demo", MainActivity.class),
new BaiduDemo("fragmentMap", FragmentMapActivity.class),
new BaiduDemo("multimap",MultiMapActivity.class),
new BaiduDemo("overlay",OverlayActivity.class)};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
initView();
setListener();
MyAdapter adapter = new MyAdapter();
lvShow.setAdapter(adapter);
}
private void setListener() {
lvShow.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent();
intent.setClass(WelcomeActivity.this, baiduDemos[position].cls);
startActivity(intent);
}
});
}
private void initView() {
lvShow = (ListView) findViewById(R.id.lvShow);
}
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return baiduDemos.length;
}
@Override
public Object getItem(int position) {
return baiduDemos[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(WelcomeActivity.this).inflate(
R.layout.list_item, parent, false);
TextView txtTitle = (TextView) convertView
.findViewById(R.id.txtTitle);
txtTitle.setText(baiduDemos[position].title);
return convertView;
}
}
class BaiduDemo {
String title;
Class<? extends Activity> cls;
public BaiduDemo(String title, Class<? extends Activity> cls) {
super();
this.title = title;
this.cls = cls;
}
}
}
(三)基礎地圖
public class MainActivity extends Activity {
MapView mMapView = null;
private BaiduMap mBaiduMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各組件之前初始化context信息,傳入ApplicationContext
// 注意該方法要再setContentView方法之前實現
// SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 普通地圖
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 衛星地圖
// mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
// 空白地圖,基礎地圖瓦片將不會被渲染。在地圖類型中設置爲NONE,將不會使用流量下載基礎地圖瓦片圖層。
// 使用場景:與瓦片圖層一起使用,節省流量,提升自定義瓦片圖下載速度。
// mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
// 在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
}
(四)FragmentMapActivity
public class FragmentMapActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_map);
FragmentManager manager = getSupportFragmentManager();
// MapStatus 定義地圖的狀態,overlook 俯視角度;zoom 縮放倍距; rotate 旋轉角度
MapStatus status = new MapStatus.Builder().overlook(45).zoom(21)
.rotate(0).build();
// BaiduMapOptions MapView初始化選項
BaiduMapOptions options = new BaiduMapOptions().mapStatus(status);
// 通過BaiduMapOptions獲得一個SupportMapFragment對象
Fragment fragment = SupportMapFragment.newInstance(options);
manager.beginTransaction().add(R.id.rl,fragment).commit();
}
}
(五)多地圖展示
public class MultiMapActivity extends FragmentActivity {
// LatLng地理座標基本數據結構
private static final LatLng GEO_BEIJING = new LatLng(39.945, 116.404);
private static final LatLng GEO_SHANGHAI = new LatLng(31.227, 121.481);
private static final LatLng GEO_XIAN = new LatLng(34.2656790000,
108.9534590000);
private static final LatLng GEO_SHENGZHENG = new LatLng(22.560, 114.064);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_multi_map);
initView();
}
private void initView() {
FragmentManager manager = getSupportFragmentManager();
// SupportMapFragment fmBeijing = (SupportMapFragment)
// manager.findFragmentById(R.id.fmBeijing);
//
// MapStatusUpdate latlngBeijing =
// MapStatusUpdateFactory.newLatLng(GEO_BEIJING);
//
// fmBeijing.getBaiduMap().setMapStatus(latlngBeijing);
setMapView(manager,R.id.fmBeijing,GEO_BEIJING);
setMapView(manager,R.id.fmShanghai,GEO_SHANGHAI);
setMapView(manager,R.id.fmShenzhen,GEO_SHENGZHENG);
setMapView(manager,R.id.fmXian,GEO_XIAN);
}
private void setMapView(FragmentManager manager, int resId, LatLng ll) {
SupportMapFragment fm = (SupportMapFragment) manager
.findFragmentById(resId);
// Class MapStatusUpdate 描述地圖狀態將要發生的變化
// MapStatusUpdateFactory 生成地圖狀態將要發生的變化
MapStatusUpdate latlng = MapStatusUpdateFactory.newLatLng(ll);
fm.getBaiduMap().setMapStatus(latlng);
}
}
(六)添加文字覆蓋物、多邊形覆蓋物、標註覆蓋物、彈出窗覆蓋物
public class OverlayActivity extends Activity {
private MapView mvMap = null;
private BaiduMap baiduMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overlay);
mvMap = (MapView) findViewById(R.id.mvMap);
baiduMap = mvMap.getMap();
// 添加文字覆蓋物
// addText();
// 添加多邊形覆蓋物
// addPolygon();
// 設置標記
// addMarker();
// 設置彈出窗覆蓋物
addInfoWindow();
}
private void addInfoWindow() {
// 創建InfoWindow展示的View
Button btn = new Button(this);
btn.setBackgroundColor(Color.BLUE);
btn.setText("我愛北京天安門");
// 通過傳入的 view 構造一個 InfoWindow, 此時只是利用該view生成一個Bitmap繪製在地圖中
/**
* Parameters:
* view - InfoWindow 展示的 view
* position - InfoWindow 顯示的地理位置
* yOffset - InfoWindow Y 軸偏移量(方向 +向下,-向上)
*/
InfoWindow infoWindow = new InfoWindow(btn, new LatLng(39.9149390000,
116.4042620000), 100);
baiduMap.showInfoWindow(infoWindow);
}
private void addMarker() {
MarkerOptions markerOptions = new MarkerOptions();
ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>();
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_0));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_1));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_2));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_3));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_4));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_5));
list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_6));
markerOptions.position(new LatLng(39.945, 116.404)).icons(list);
baiduMap.addOverlay(markerOptions);
}
private void addPolygon() {
List<LatLng> pts = new ArrayList<LatLng>();
// 定義多邊形的五個頂點
LatLng pt1 = new LatLng(39.93923, 116.357428);
LatLng pt2 = new LatLng(39.91923, 116.327428);
LatLng pt3 = new LatLng(39.89923, 116.347428);
LatLng pt4 = new LatLng(39.89923, 116.367428);
LatLng pt5 = new LatLng(39.91923, 116.387428);
pts.add(pt1);
pts.add(pt2);
pts.add(pt3);
pts.add(pt4);
pts.add(pt5);
// 構建用戶繪製多邊形的option對象
/**
* class Stroke 邊框類,可以給圓、多邊形設置一個邊框 構造函數 int strokeWidth 邊框的寬度, 單位:像素,
* int color 邊框的顏色
*/
OverlayOptions polygonOptions = new PolygonOptions().points(pts)
.fillColor(0xAAFFFF00).stroke(new Stroke(5, 0xAA00FF00));
baiduMap.addOverlay(polygonOptions);
}
private void addText() {
// 自定義文字所顯示的座標點
LatLng llText = new LatLng(39.9306540000, 116.3925480000);
// 構建文字option對象,用於在地圖上添加文字,並設置文字背景色、字體大小、字體顏色、文本、旋轉角度、顯示位置
OverlayOptions textOption = new TextOptions()
.bgColor(Color.rgb(100, 100, 100)).fontSize(26)
.fontColor(0xFFFF00FF).text("百度地圖SDK").rotate(0)
.position(llText);
// 在地圖上添加文字對象並顯示
baiduMap.addOverlay(textOption);
}