概述,为了满足项目的需求,在项目当中集成了百度map,除了简单的定位,还包含了poi搜索,地理编码、周边搜索等功能;
1.集成,首先要去百度地图开发者平台成为开发者,并申请appkey,规则是sha1 + packageName;
如果不知道怎么申请key,可以看说明,例如
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key 如果觉得太长不看也没关系,可以直接将baiduMap demo运行一遍,当然项目能运行,但并不能跑通,可以观察到在android monitor当中会告诉你的sha1以及包名,那么就直接用这个去申请创建自己项目即可;说点题外话,将其他的项目移植到自己的Android studio当中,那么需要改动的地方有几个,如图 :
将项目build.gradle的compile 改成自己项目中的compile版本,我这边是2.3.1那么直接改,其次就是在gredle文件下有个gradle-wrapper.properties文件,也改成自己的,我这边是3.3;好了转回正文,开始我们项目集成;
(1).下载demo,将libs库当中jar包以及.so文件移植到项目中jniLibs目录下;
(2).androidManifest.xml文件当中将必须的permission service copy;
(3).开始项目代码的编写;
private void initMap() {
// 地图初始化
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//设置扫描频率,值<1000ms将不执行
option.setIsNeedLocationPoiList(true); //获取定位周边poi信息
mLocClient.setLocOption(option);
mLocClient.start();
}
这里的myListener需要去implement BDLocationListener并重写onReceiveLocation,重点是可以获取poi列表,我们一般定位是基于手机,不单单是wifi、gps、基站等;那么怎么能比较准确呢?
/**
* 定位SDK监听函数
*/
public class LocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
MyLocationData locData = new MyLocationData.Builder()
/**周边范围*/
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).
latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
/**latlng是经纬度坐标的类*/
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
List poiList = location.getPoiList();
if(poiList != null && poiList.size() > 0) {
for (int i = 0; i< poiList.size();i ++) {
Log.e(Tag,poiList.get(i).address);
Log.e(Tag,poiList.get(i).name);
//可以将address和name信息拼接成adapter的bean,并增加到列表供用户选择
}
}
}
}
}
我这边提供一个简单的layout,如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.baidu.mapapi.map.MapView
android:layout_width="match_parent"
android:layout_height="260dp"
android:id="@+id/map_view"/>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"/>
</LinearLayout>
当然我不是这么做的,因为还有一种更好的方法,可以提供更加准确的poi列表,这边是使用定位后的经纬度反地理编码后的poi列表,而且用户在移动mapView的同时,随时获取map中点附件poi列表