在开发android项目中,肯定会有地图需求,比如说定位之类,现在有很多第三方地图api可以供我们使用,比如百度、高德,今天我们主要学习百度地图
首先要使用百度地图得先到百度地图api的控制台去申请一个应用:http://lbsyun.baidu.com/apiconsole/key
然后创建一个android应用,这里需要我们填写应用名称和安全码,安全码由我们的编译器的SHA1+;+应用包名,比如我的39:EF:27:35:92:E6:FF:9A:16:22:16:74:DB:B9:EA:28:E3:17:E4:A0;com.baidumapdemo
创建成功后我们就拥有属于应用的ak了
接着我们去下载百度地图的sdk,在下载的时候选择你需要的功能下载,也可以全部下载
然后集成到我们的项目的libs中去,再去manifest中去配置相关参数
权限:
<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" />
开发密钥,填写我们刚才申请的ak
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="ly5VHFSGer0gbMrEG4rtK2zg" />
定位服务
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.baidu.location.service_v2.2" >
</action>
</intent-filter>
</service>
配置完了,我们就可以正式开始开发了
首先在xml中加一个mapview控件
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
接着就开始编写我们的代码
在应用开始之前初始化sdk
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
实例化mapview,实现生命周期的方法
public class MainActivity extends Activity {
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
运行图
可以看到我们的地图已经成功的运行了,不过当前地图并不是我们当前的位置,所有我们就来实现它的定位功能
实现定位功能主要使用sdk的BaiduMap,LocationClient,BDLocationListener、LocationClientOption这个四个类
通过BaiduMap得到mapview
baiduMap = mapView.getMap();
实例化LocationClient
locationClient = new LocationClient(this);
定位监听
private class myBaidu implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation arg0) {
// TODO Auto-generated method stub
}
}
给locationClinet注册定位监听
locationClient.registerLocationListener(new myBaidu());
定位需要的设置LocationClientOption
options = new LocationClientOption();
options.setCoorType("bd09ll");//获取经纬度方式
options.setIsNeedAddress(true);//获取定位地址
options.setOpenGps(true);//打开gps
options.setScanSpan(1000);//刷新位置周期
locationClient.setLocOption(options);
在定位监听方法中实现定位
private class myBaidu implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
MyLocationData data = new MyLocationData.Builder()//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//经度
.longitude(location.getLongitude())//纬度
.build();
baiduMap.setMyLocationData(data);//设置到map
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());//设置定位到经纬度到latlng
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);//根据经纬度刷新map
baiduMap.animateMapStatus(msu);//动画过度
}
}
开启定位,关闭定位
@Override
protected void onStart() {
super.onStart();
baiduMap.setMyLocationEnabled(true);//允许定位
locationClient.start();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
baiduMap.setMyLocationEnabled(false);
locationClient.stop();
}
运行图
定位功能我们就实现了
这里我们可以更换掉定位之后的图标
这里使用
BitmapDescriptor,MyLocationConfiguration来实现
先得到需要更换的图
bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
然后更换
MyLocationConfiguration configuration = new MyLocationConfiguration(LocationMode.NORMAL, true, bitmap);
baiduMap.setMyLocationConfigeration(configuration);
运行图
我们同样也可以在地图上根据不同的坐标添加一些覆盖物,类似在地图上搜索加油站显示的图标一样
double[][] ll = {{30.67,104.16},{30.67,104.06},{30.67,104.26}};
baiduMap.clear();
Marker marker = null;
LatLng latLng = null;
OverlayOptions overlayOptions;
for (int i = 0; i < ll.length; i++) {
latLng = new LatLng(ll[i][0], ll[i][1]);//定义Maker坐标点
//构建MarkerOption,用于在地图上添加Marker
overlayOptions = new MarkerOptions()
.position(latLng)//设置marker的位置
.icon(bitmap)//设置marker图标
.zIndex(5);//设置marker所在层级
marker = (Marker) baiduMap.addOverlay(overlayOptions);//将marker添加到地图上
}
MapStatusUpdate m = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(m);
运行图
百度地图的开发其实很好做,官方的demo和api文档已经写得很明白了,只要花点时间,就能明白
项目代码:点击打开链接