最近项目中有用到搜索附近4S店和加油站的功能,于是我写了个Demo,输入你想查找的内容,就可以显示相关的信息.效果如下:
PS:listview中有两个纬度,后一个应该是经度的,不小心写错了名称。
这里使用的是高德地图,先需要去高德SDK网站申请一个key,下载相应的SDK导入工程,需要地图SDK和定位SDK,网站在此,然后配置AndroidManifest文件。
配置对应权限:
配置key
配置定位的服务
现在编写代码了。先实现定位,获取手机的经纬度,先创建一个AMapLocationClient
对象, 然后设置定位回调监听,需要创建一个mLocationListener对象
// 声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (amapLocation != null) {
if (amapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
Latitude=amapLocation.getLatitude();//获取纬度
Longitude=amapLocation.getLongitude();//获取经度
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError","location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
};
再获取定位参数配置AMapLocationClientOption的实例,进行一些参数的配置,比如定位模式,间隔等。
// 初始化定位参数
mLocationOption = new AMapLocationClientOption();
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
// 设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
// 设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
// 设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
// 设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
给客户端对象设置参数,开始监听
// 给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
// 启动定位
mLocationClient.startLocation();
在mLocationListener的回调监听里可以获得经纬度,下一步就是搜索附近的实现了,PS: 别忘了在onDestory方法里关闭定位.
先通过new PoiSearch.Query(keyword, type,cityCode )创建一个Query对象。 传入三个参数,keyword是你要查找的内容,type是要查找的类型,默认为:生活服务、餐饮服务、商务住宅,共有20种,cityCode是城市编号,可以传空值,空值表示在全国范围里查找。获取Query对象后,可以设置返回多少条结果,查第几页。传入context和Query对象获得PoiSearch对象,通过setBound方法设置中心点和查找区域,中心点则是之前获取的定位的经纬度。
之后设置回调监听器,然后调用searchPOIAsyn()方法开始搜索。
query = new PoiSearch.Query(content, "汽车维修|修车服务", "");
// keyWord表示搜索字符串,第二个参数表示POI搜索类型,默认为:生活服务、餐饮服务、商务住宅
// 共分为以下20种:汽车服务|汽车销售|
// 汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|
// 住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|
// 金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
// cityCode表示POI搜索区域,(这里可以传空字符串,空字符串代表全国在全国范围内进行搜索)
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(1);// 设置查第一页
PoiSearch poiSearch = new PoiSearch(this, query);
//如果不为空值
if(Latitude!=0.0&&Longitude!=0.0){
poiSearch.setBound(new SearchBound(new LatLonPoint(Latitude,
Longitude), 6000));// 设置周边搜索的中心点以及区域
poiSearch.setOnPoiSearchListener(this);// 设置数据返回的监听器
poiSearch.searchPOIAsyn();// 开始搜索
}else{
Toast.makeText(MainActivity.this, "定位失败", 0).show();
}
返回的结果在onPoiSearched方法里,就是参数PoiResult,这里我用listview展示了结果。result.getPois()返回类型为Poiltem的Arraylist集合,Poiltem有许多属性,例如通过getTel()获取电话,getDistance()获取距离,getLatLonPoint获取纬度等。
@Override
public void onPoiSearched(PoiResult result, int code) {
MyAdapter mAdapter=new MyAdapter(MainActivity.this,result.getPois());
result_listview.setAdapter(mAdapter);
}
就这样完成了附近搜索功能,大家可以自己尝试下。
Demo地址:点击打开链接