(一)配置环境步骤:
官网帮助: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);
}