百度地图开发的笔记(篇1)
来源:互联网 发布:大数据平台基础设施 编辑:程序博客网 时间:2024/06/01 09:23
前言:
总觉得时间太少,还是得怪自己太懒.项目开发中不可避免会用到定位搜索功能、微信支付功能、微信QQ登录分享这些功能,近期的项目中又遇到类似的功能,所以不可避免得去集成这些相关的SDK,同一功能的不同SDK也是挺多家的,所以根据场景不同,也得做出相应的选择。 这篇文章就开始总结下关于定位功能的,由于最近项目使用到的是百度地图SDK,所以总结下吧!
I. 集成百度SDK
下面是百度SDK集成文档的官方地址
百度SDK集成的地址:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key
只要跟着官方开发文档的步骤,先申请app key,接着填写下面截图的资料信息,至于项目的发布版SHA1和开发版SHA1怎么获取,可以点击进去 “查看详细配置方法”进去查看如何获取sha1值;个人建议发布版sha1和开发版SHA1一致即可,一般填上发布版的正式包对应的SHA1值,那么这就需要在开发时使debug包的签名和正式包的签名一致.
下面针对项目的gradle文件进行相应的配置(基于Android Studio),使得项目的发布版和开发版使用同一签名,取得的SHA1值也一致.
android { compileSdkVersion 23 buildToolsVersion "23.0.3" sourceSets { main { //jniLibs.srcDir 'libs' //百度地图 jniLibs.srcDirs = ['libs'] //第三方so库 } } signingConfigs { debug { storeFile file("../yourapp.keystore") //签名文件路径 storePassword "your password" keyAlias "your alias" keyPassword "your password" } release { storeFile file("../yourapp.keystore") storePassword "your password" keyAlias "your alias" keyPassword "your password" } } buildTypes { debug { // 显示Log buildConfigField "boolean", "LOG_DEBUG", "true" signingConfig signingConfigs.debug //debug模式下引用signingConfigs.debug的签名 //不相关的省略 } release { buildConfigField "boolean", "LOG_DEBUG", "false" signingConfig signingConfigs.release //不相关的省略 } }
接着还是按照官方文档引入相应功能的so包和jar包,当然还有需要注意的:
- 1.比如在gradle文件添加jniLibs配置命令
- 2.项目配置依赖jar包,
关于Android Studio的配置具体的建议看官方demo.
Ⅱ. Hello BaiduMap
很熟悉的Hello World,对百度地图SDK并不了解怎么接入的话,可以先看下百度文档关于基础地图的介绍
Hello BaiduMap 文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
注意点:
1.下面是初始化SDK的操作,官方建议放在程序的入口处(Application类里),其实大多SDK的初始化都建议放在Application类,但在集成的同时就得考虑这么一问题,在程序在启动之时去初始化这些集成的SDK,如果集成的SDK较多,那势必会引起应用启动时间延长.所以个人觉得如果应用不是主功能的地方使用到SDK,一般情况下可以把SDK初始化操作放在activity的入口处(onCreate生命周期方法等),比如在开发的应用中个人信息中的地址选项需要用到定位功能,那么则可以在地址选项页所在的activity进行初始化定位SDK.
public class MyDataActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(Global.getApplicationContext()); setContentView(R.layout.activity_main); } }
2.注意将activity与MapView的生命周期进行绑定
@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(); }
那么只需要参照Hello BaiduMap,简单的几个步骤,就可以对百度地图SDK有个大概的了解.
Ⅲ. 简单集成定位
效果图:
下面是具体的代码,详细介绍都在注释中说明
/** *SDKInitializer.initialize()已经在JobAddressFragment *所在的activity的onCreate方法进行调用 */ public class JobAddressFragment extends BaseFragment{ public int radius = 20; public LocationClient mLocationClient = null; private MapView mBaiduMapView; private BaiduMap mbaiduMap; private Dialog loadingDialog; public String mCity; @Override public int getLayoutRes() { return R.layout.jobaddress; } @Override public void initView() { mBaiduMapView = findView(R.id.job_address_baidu); mbaiduMap = mBaiduMapView.getMap(); loadingDialog = GlobalUtils.getLoadingDialog(mActivity, GlobalUtils.getString(R.string.usercenter_edit_name_save),false); } @Override public void initData() { //检测GPS是否开启 if(!GlobalUtils.isOpenGps(Global.getContext())){ showToast(GlobalUtils.getString(R.string.usercenter_selete_address_gps_close)); return; } initLocation(); beginLocation(); } //启动定位功能 private void beginLocation(){ LocationClientOption option = new LocationClientOption();//高精度 //LocationMode 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setScanSpan(0);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于5000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setCoorType("bd09ll"); mLocationClient.setLocOption(option); mLocationClient.start(); //开启定位 // 隐藏百度地图的logo View child = mBaiduMapView.getChildAt(1); if (child != null && (child instanceof ImageView || child instanceof ZoomControls)){ child.setVisibility(View.INVISIBLE); } mBaiduMapView.showScaleControl(false); //地图上比例尺 mBaiduMapView.showZoomControls(false); // 隐藏缩放控件 } //定位功能进行初始化的操作 private void initLocation() { //note 打开定位图层,显示当前位置 mbaiduMap.setMyLocationEnabled(true); MyLocationConfiguration config = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, // 跟随态,保持定位图标在地图中心 false, // 是否显示定位指标的方向 null);// null表示使用默认图标 mbaiduMap.setMyLocationConfigeration(config); // 创建定位对象 mLocationClient = new LocationClient(mActivity); // 设置监听器接收搜索结果 mLocationClient.registerLocationListener(new BDLocationListener() { @Override // 定位到数据回调此方法 public void onReceiveLocation(BDLocation location) { if (location == null) { return; } /**获取定位的信息*/ String addrStr = location.getAddrStr(); // 详细的地址信息 mCity = location.getCity(); // 城市 latitude = location.getLatitude(); // 纬度 longitude = location.getLongitude(); // 经度 /**初始化搜索配置,展开搜索*/ //initSearch(); //beginSearch(); MyLocationData datas = new MyLocationData .Builder() .latitude(latitude) .longitude(longitude) .accuracy(location.getRadius()) // accuracy: 定位的精度 .build(); mbaiduMap.setMyLocationData(datas);// 更新我的位置, 刷新界面显示 } }); } @Override public void onResume() { mBaiduMapView.setVisibility(View.VISIBLE); mBaiduMapView.onResume(); super.onResume(); } @Override public void onPause() { mBaiduMapView.setVisibility(View.INVISIBLE); mBaiduMapView.onPause(); super.onPause(); } @Override public void onDestroy() { super.onDestroy(); if(mLocationClient != null){ mLocationClient.stop(); //销毁时关闭定位 } mBaiduMapView.onDestroy(); mBaiduMapView = null; }
小插曲:产品的需求里,要求更换默认的定位图标,那么咋整?
更换定位图标的代码如下:
BitmapDescriptor mapIndicator = BitmapDescriptorFactory.fromResource(R.drawable.usercenter_map_indicator); MyLocationConfiguration config = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING,//NORMAL普通态//COMPASS //FOLLOWING跟随态,保持定位图标在地图中心 false, // 是否显示方向 mapIndicator);// 使用自定义图标
效果图:
Ⅳ. 简单集成搜索(周边搜索+城市搜索)
完成定位功能的集成之后,根据需求也要完成下搜索的功能.
产品需求:要求进入该界面就开始定位,并搜索出附近的大厦,搜索框输入关键词则可以进行搜索
下面是具体的代码实现,详细介绍都在注释中说明
private PoiSearch mPoiSearch; //初始化搜索配置 private void initSearch() { mPoiSearch = PoiSearch.newInstance(); // 创建搜索对象 // 设置监听器 mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND){ showToast("没有搜索到结果"); return ; } // 搜索到的所有的结果 List<PoiInfo> allPoi = poiResult.getAllPoi(); jobAddress = new ArrayList<LocationGpsBean>(); if(allPoi!=null && allPoi.size()>0) { for (PoiInfo info : allPoi) { LocationGpsBean bean = new LocationGpsBean(); bean.blackName = info.name; bean.address = info.address; jobAddress.add(bean); } }else{ showToast("没有搜索到结果"); return; } //搜索到结果之后再移除原有的 PoiOverlay poioverlay = new PoiOverlay(mbaiduMap); poioverlay.setData(poiResult); //设置搜索到的POI数据 mbaiduMap.clear(); poioverlay.addToMap(); //兴趣点标注在地图上 poioverlay.zoomToSpan(); //缩放地图 mAdapter = new JobAddressAdapter(mActivity, jobAddress); if(jobAddress!=null && jobAddress.size()>0){ mAdapter.selectPosition(0); selectGpsBean = jobAddress.get(0); } mLvAddressNews.setAdapter(mAdapter); } @Override // 详情数据 public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { if (poiDetailResult == null || poiDetailResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { showToast("没有搜索到结果"); return ; } String name = poiDetailResult.getName();// 名称 String address = poiDetailResult.getAddress();// 地址 LatLng location = poiDetailResult.getLocation();// 经纬度 double serviceRating = poiDetailResult.getServiceRating();// 服务星级 double environmentRating = poiDetailResult.getEnvironmentRating(); // 环境星级 String info = "name: " + name + " \nuid: " + poiDetailResult.getUid() + " \naddress: " + address + " \nlocation: " + location + " \nenvironmentRating: " + environmentRating + " \nserviceRating: " + serviceRating; showToast(info); } }); } private double latitude; private double longitude; /**一开始进行周边搜索*/ private void beginSearch() { LatLng mCurrentPos = new LatLng(latitude,longitude); // 设置搜索选项 PoiNearbySearchOption option = new PoiNearbySearchOption(); option.keyword("大厦"); // 搜索关键字 option.location(mCurrentPos); // 搜索的中心点 option.radius(100); // 搜索100米以内 // 发起搜索 mPoiSearch.searchNearby(option); } /**搜索框进行城市搜索*/ private void search() { GlobalUtils.hideKeyboard(mEtInputSearch); //收起键盘 String searchInput = mEtInputSearch.getText().toString().trim();//输入的关键词 if(TextUtils.isEmpty(searchInput)){ showToast("搜索内容为空,请输入!"); return ; } //下面做搜寻的操作 if(mPoiSearch == null){ initSearch(); } // 发起搜索, if(!TextUtils.isEmpty(mCity)){ //mCity为定位到的城市,进行城市搜索 mPoiSearch.searchInCity((new PoiCitySearchOption()) .city(""+mCity) .keyword(searchInput)); }else{ //如果定位不成功或定位不到城市信息的情况下,则默认搜索城市为"广州" //虽然默认是广州,但可以对任意关键词进行搜索 mPoiSearch.searchInCity((new PoiCitySearchOption()) .city("广州") .keyword(searchInput)); } }
上面就是具体的搜索代码,可以看到通过在initSearch方法里对mPoiSearch设置OnGetPoiSearchResultListener监听器,发起周边搜索以及搜索框搜索都会触发OnGetPoiSearchResultListener监听器,在监听器得到所搜索到的对象信息,进行兴趣点标注及ListView的信息展示,上面代码都已注释说明.
Ⅴ.总结+发发牢骚
1.上面简单记录了百度地图的定位和搜索功能,其他功能的可以参考百度SDK官方文档;
2.上面的定位+搜索功能只是简单的展示,当然还是有问题的,比如默认城市为广州进行搜索,针对一部分关键词还是搜索不到结果的。身在开发,心得由着产品,产品需求如此,开发周期短,之后再补过;
3.最近对该文章的功能进行了修改和优化,另找时间总结总结;
4.回首呆望,个把月没写博客咯,2016年的最后一个月了,抓紧时间总结,别让项目的无厘头需求改动搅乱了自己,加油!
- 百度地图开发的笔记(篇1)
- 百度地图API的开发(1)
- iOS百度地图开发笔记(一)
- iOS百度地图开发笔记(一)
- iOS百度地图开发笔记(二)
- iOS百度地图开发笔记(三)
- 百度地图开发(1)
- 学习笔记 - 百度地图开发
- 百度地图sdk开发笔记
- 百度地图笔记(1)
- 百度地图开发1
- 百度地图开发小结(1)
- 百度地图sdk Android开发学习笔记(一)
- 百度地图开发练习(1)不可以显示地图,只有网格的解决方法
- 百度地图的定位笔记
- 百度地图的开发(2)
- 百度地图开发的坑
- 百度的地图开发API
- jQuery 效果 - animate() 方法
- Android静默安装和自动安装
- NS2笔记 invalid command name "Agent/TCPSink/mTcpSink"......
- Java Class的热替换 自定义ClassLoader加载.class
- Quartz cron表达式格式
- 百度地图开发的笔记(篇1)
- bzoj3672: [Noi2014]购票
- node中遇到的坑
- 美好的诗收集
- Fresco进行图片的下载,高斯模糊
- zurmo安装文档说明(windows)
- 理解MVC,MVP和MVVM设计模式
- HTML5之帆布(canvas)(四)
- ecplise安装离线的svn步骤