高德地图——定位 检索 导航全套
附上DEMO
申请key
public String sHA1(Context context) {try {PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);byte[] cert = info.signatures[0].toByteArray();MessageDigest md = MessageDigest.getInstance("SHA1");byte[] publicKey = md.digest(cert);StringBuffer hexString = new StringBuffer();for (int i = 0; i < publicKey.length; i++) {String appendString = Integer.toHexString(0xFF & publicKey[i]).toUpperCase(Locale.US);if (appendString.length() == 1)hexString.append("0");hexString.append(appendString);hexString.append(":");}return hexString.toString();} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}
配置工程
准备完成,开始定位地图:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_search);presenter = new SearchPresenter(this);//获取地图控件引用mMapView = (MapView) findViewById(R.id.map);//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理mMapView.onCreate(savedInstanceState);//初始化地图变量if (aMap == null) {aMap = mMapView.getMap();}aMap.setInfoWindowAdapter(this);mlocationClient = new AMapLocationClient(this);
//初始化定位参数mLocationOption = new AMapLocationClientOption();
//设置定位监听mlocationClient.setLocationListener(this);
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位间隔,单位毫秒,默认为2000msmLocationOption.setInterval(2000);//设置一次定位mLocationOption.setOnceLocation(true);
//设置定位参数mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
//启动定位mlocationClient.startLocation();aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {return false;}});}
定位成功,回调监听:
@Overridepublic void onLocationChanged(AMapLocation amapLocation) {if (amapLocation != null) {if (amapLocation.getErrorCode() == 0) {//定位成功回调信息,设置相关消息amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表amapLocation.getLatitude();//获取纬度amapLocation.getLongitude();//获取经度amapLocation.getAccuracy();//获取精度信息SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(amapLocation.getTime());df.format(date);//定位时间// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(12));//将地图移动到定位点aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude())));LatLng latLng = new LatLng(amapLocation.getLatitude(), amapLocation.getLongitude());latLonPoint = latLng;//在地图中设置定位坐标点MarkerOptions markerOption = new MarkerOptions();markerOption.position(latLng);markerOption.draggable(true);markerOption.icon(BitmapDescriptorFactory.fromResource(R.mipmap.dingwei));markerOption.title(amapLocation.getPoiName()).snippet(amapLocation.getAddress());Marker marker = aMap.addMarker(markerOption);marker.setRotateAngle(0);//定位成功,开启检测功能startSearch(amapLocation.getLatitude(), amapLocation.getLongitude());} else {//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ amapLocation.getErrorCode() + ", errInfo:"+ amapLocation.getErrorInfo());}}}
在定位回调中开启检测功能
startSearch(amapLocation.getLatitude(), amapLocation.getLongitude());
private void startSearch(double Latitude, double Longitude) {PoiSearch.Query query = new PoiSearch.Query("加油站", "汽车维修|修车服务", "");// keyWord表示搜索字符串,第二个参数表示POI搜索类型,默认为:生活服务、餐饮服务、商务住宅// 共分为以下20种:汽车服务|汽车销售|// 汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|// 住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|// 金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施// cityCode表示POI搜索区域,(这里可以传空字符串,空字符串代表全国在全国范围内进行搜索)query.setPageSize(10);// 设置每页最多返回多少条poiitemquery.setPageNum(1);// 设置查第一页PoiSearch poiSearch = new PoiSearch(this, query);//如果不为空值if (Latitude != 0.0 && Longitude != 0.0) {poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(Latitude,Longitude), 6000));// 设置周边搜索的中心点以及区域poiSearch.setOnPoiSearchListener(this);// 设置数据返回的监听器poiSearch.searchPOIAsyn();// 开始搜索} else {
// Toast.makeText(SearchActivity.this, "定位失败", 0).show();}}
检索成功后,在地图上设置涂点:
@Overridepublic void onPoiSearched(PoiResult poiResult, int i) {//结果if (poiResult.getPois() == null)return;ArrayList<PoiItem> poiItems = poiResult.getPois();for (PoiItem a : poiItems) {addMarkerToMap(a);}}private void addMarkerToMap(PoiItem a) {LatLng latLng = new LatLng(a.getLatLonPoint().getLatitude(), a.getLatLonPoint().getLongitude());MarkerOptions markerOption = new MarkerOptions();markerOption.position(latLng);markerOption.draggable(true);markerOption.icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_location));markerOption.title(a.getCityName()).snippet(a.getBusinessArea());Marker marker = aMap.addMarker(markerOption);marker.setRotateAngle(0);//显示InfoWindow}
接下来是目标点点击事件,这里我采用了点击后弹出自定义弹窗:
@Overridepublic View getInfoWindow(final Marker marker) {View view = getLayoutInflater().inflate(R.layout.bdmap_node_popwindow,null);view.findViewById(R.id.item3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {naviMapStart(marker);}});return view;}@Overridepublic View getInfoContents(final Marker marker) {View view = getLayoutInflater().inflate(R.layout.bdmap_node_popwindow,null);
// TextView title = (TextView) view.findViewById(R.id.title);
// title.setText(marker.getTitle());view.findViewById(R.id.item3).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {naviMapStart(marker);}});return view;}
注意:设置自定义弹窗首先要先设置监听,让高德来拿取我们自定义的view,这里很坑,卡了我3、4个小时。
//设置自定义view事件
aMap.setInfoWindowAdapter(this);
当然activity需要继承接口AMap.InfoWindowAdapter。
导航功能配置
public class AMapNaviActivity extends NaviBaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_amap_navi);mAMapNaviView = (AMapNaviView) findViewById(R.id.navi_view);mAMapNaviView.onCreate(savedInstanceState);mAMapNaviView.setAMapNaviViewListener(this);AMapNaviViewOptions options = mAMapNaviView.getViewOptions();options.setLayoutVisible(false);mAMapNaviView.setViewOptions(options);}public void northUp(View view) {mAMapNaviView.setNaviMode(AMapNaviView.NORTH_UP_MODE);}public void carUp(View view) {mAMapNaviView.setNaviMode(AMapNaviView.CAR_UP_MODE);}@Overridepublic void onInitNaviSuccess() {super.onInitNaviSuccess();/*** 方法: int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); 参数:** @congestion 躲避拥堵* @avoidhightspeed 不走高速* @cost 避免收费* @hightspeed 高速优先* @multipleroute 多路径** 说明: 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。* 注意: 不走高速与高速优先不能同时为true 高速优先与避免收费不能同时为true*/int strategy = 0;try {//再次强调,最后一个参数为true时代表多路径,否则代表单路径strategy = mAMapNavi.strategyConvert(true, false, false, false, false);} catch (Exception e) {e.printStackTrace();}mAMapNavi.calculateDriveRoute(SearchActivity.startPoints , SearchActivity.endPoints , mWayPointList, strategy);}@Overridepublic void onCalculateRouteSuccess() {super.onCalculateRouteSuccess();mAMapNavi.startNavi(NaviType.GPS);}
}
其中继承的类为:
public class NaviBaseActivity extends Activity implements AMapNaviListener, AMapNaviViewListener {protected AMapNaviView mAMapNaviView;protected AMapNavi mAMapNavi;
// protected TTSController mTtsManager;protected List<NaviLatLng> sList = new ArrayList<NaviLatLng>();protected List<NaviLatLng> eList = new ArrayList<NaviLatLng>();protected List<NaviLatLng> mWayPointList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);
// //实例化语音引擎
// mTtsManager = TTSController.getInstance(getApplicationContext());
// mTtsManager.init();//mAMapNavi = AMapNavi.getInstance(getApplicationContext());mAMapNavi.addAMapNaviListener(this);
// mAMapNavi.addAMapNaviListener(mTtsManager);//设置模拟导航的行车速度mAMapNavi.setEmulatorNaviSpeed(75);}@Overrideprotected void onResume() {super.onResume();mAMapNaviView.onResume();}@Overrideprotected void onPause() {super.onPause();mAMapNaviView.onPause();// 仅仅是停止你当前在说的这句话,一会到新的路口还是会再说的
// mTtsManager.stopSpeaking();
//
// 停止导航之后,会触及底层stop,然后就不会再有回调了,但是讯飞当前还是没有说完的半句话还是会说完
// mAMapNavi.stopNavi();}@Overrideprotected void onDestroy() {super.onDestroy();mAMapNaviView.onDestroy();//since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行mAMapNavi.stopNavi();mAMapNavi.destroy();
// mTtsManager.destroy();}@Overridepublic void onInitNaviFailure() {Toast.makeText(this, "init navi Failed", Toast.LENGTH_SHORT).show();}@Overridepublic void onInitNaviSuccess() {//初始化成功}@Overridepublic void onStartNavi(int type) {//开始导航回调}@Overridepublic void onTrafficStatusUpdate() {//}@Overridepublic void onLocationChange(AMapNaviLocation location) {//当前位置回调}@Overridepublic void onGetNavigationText(int type, String text) {//播报类型和播报文字回调}@Overridepublic void onEndEmulatorNavi() {//结束模拟导航}@Overridepublic void onArriveDestination() {//到达目的地}@Overridepublic void onArriveDestination(NaviStaticInfo naviStaticInfo) {//到达目的地,有统计信息回调}@Overridepublic void onArriveDestination(AMapNaviStaticInfo aMapNaviStaticInfo) {}@Overridepublic void onCalculateRouteSuccess() {//路线计算成功}@Overridepublic void onCalculateRouteFailure(int errorInfo) {//路线计算失败Log.i("dm","errorInfo="+errorInfo);Toast.makeText(this, "errorInfo:" + errorInfo, Toast.LENGTH_SHORT).show();}@Overridepublic void onReCalculateRouteForYaw() {//偏航后重新计算路线回调}@Overridepublic void onReCalculateRouteForTrafficJam() {//拥堵后重新计算路线回调}@Overridepublic void onArrivedWayPoint(int wayID) {//到达途径点}@Overridepublic void onGpsOpenStatus(boolean enabled) {//GPS开关状态回调}@Overridepublic void onNaviSetting() {//底部导航设置点击回调}@Overridepublic void onNaviMapMode(int isLock) {//地图的模式,锁屏或锁车}@Overridepublic void onNaviCancel() {finish();}@Overridepublic void onNaviTurnClick() {//转弯view的点击回调}@Overridepublic void onNextRoadClick() {//下一个道路View点击回调}@Overridepublic void onScanViewButtonClick() {//全览按钮点击回调}@Deprecated@Overridepublic void onNaviInfoUpdated(AMapNaviInfo naviInfo) {//过时}@Overridepublic void onNaviInfoUpdate(NaviInfo naviinfo) {//导航过程中的信息更新,请看NaviInfo的具体说明}@Overridepublic void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) {//已过时}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) {//已过时}@Overridepublic void showCross(AMapNaviCross aMapNaviCross) {//显示转弯回调}@Overridepublic void hideCross() {//隐藏转弯回调}@Overridepublic void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) {//显示车道信息}@Overridepublic void hideLaneInfo() {//隐藏车道信息}@Overridepublic void onCalculateMultipleRoutesSuccess(int[] ints) {//多路径算路成功回调}@Overridepublic void notifyParallelRoad(int i) {if (i == 0) {Toast.makeText(this, "当前在主辅路过渡", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在主辅路过渡");return;}if (i == 1) {Toast.makeText(this, "当前在主路", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在主路");return;}if (i == 2) {Toast.makeText(this, "当前在辅路", Toast.LENGTH_SHORT).show();Log.d("wlx", "当前在辅路");}}@Overridepublic void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) {//更新交通设施信息}@Overridepublic void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) {//更新巡航模式的统计信息}@Overridepublic void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) {//更新巡航模式的拥堵信息}@Overridepublic void onLockMap(boolean isLock) {//锁地图状态发生变化时回调}@Overridepublic void onNaviViewLoaded() {Log.d("wlx", "导航页面加载成功");Log.d("wlx", "请不要使用AMapNaviView.getMap().setOnMapLoadedListener();会overwrite导航SDK内部画线逻辑");}@Overridepublic boolean onNaviBackClick() {return false;}}
到这里简单的导航工具就搞定了,接下来就是在主界面进行调用导航功能:
private void naviMapStart(Marker marker) {// 导航// 起点终点列表ArrayList<NaviLatLng> startPoints = new ArrayList<NaviLatLng>();ArrayList<NaviLatLng> endPoints = new ArrayList<NaviLatLng>();LatLng endLatLng = marker.getPosition();NaviLatLng endNaviLatLng = new NaviLatLng(endLatLng.latitude,endLatLng.longitude);endPoints.add(endNaviLatLng);NaviLatLng startNaviLatLng = new NaviLatLng(latLonPoint.latitude,latLonPoint.longitude);startPoints.add(startNaviLatLng);// DrivingSaveMoney--省钱// DrivingShortDistance--最短距离// DrivingNoExpressways--不走高速// DrivingFastestTime--最短时间// DrivingAvoidCongestion--避免拥堵// AMapNavi.getInstance(SearchActivity.this)
// .calculateDriveRoute(startPoints, endPoints, null,
// AMapNavi.DrivingShortDistance);SearchActivity.startPoints = startPoints;SearchActivity.endPoints = endPoints;Intent intent = new Intent(SearchActivity.this,AMapNaviActivity.class);startActivity(intent);}
致此高德地图关于地图使用,定位功能,检索功能,导航功能就完成了。
使用后遇到64位CPU架构兼容报错问题,坎坷解决7种架构兼容问题:
高德地图——定位 检索 导航全套相关推荐
- 高德地图定位及导航开发流程
关于高德地图导航定位及导航 最进简单研究了一下关于高德地图的使用,,简单实现了定位搜素,以及驾车的路径规划,一下将介绍我的实现过程: 先展示一下实现的简单效果: 首先需要进行配置,配置详情如下: 1. ...
- Android 高德地图定位和导航
1. 在高德开放平台注册帐号 2.在高德地图开发平台中下载Android平台下载地图SDK和定位SDK和导航SDK文件 3. 添加jar包,将jar包放入工程的libs目录下. (下载的三合一的SDK ...
- flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...
- android 定位工具类,高德地图定位工具类
引言 定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题.通过该工具类,可以实现一次初始化,多处随时调用.具有占用资源少,使用方便,便于复用,速度快, ...
- 高德地图定位的简单实现
1.要实现高德地图的定位,首先要下载高德地图的SDK以及高德地图定位的SDK 下载地址:http://lbs.amap.com/api/android-sdk/download/ http://lbs ...
- 高德地图定位拖动改变位置
现在关于地图使用越来越多,相信大家可能都或多或少的用到过,本篇文章简单总结了一下关于高德地图定位且可以拖动改变位置的功能的实现. 首先按照高德开发文档,导入jar包,申请key,可以在高德地图的开放平 ...
- Android开发实现高德地图定位详解
一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位S ...
- 高德地图去掉定位按钮_怎样修改百度地图店名怎么取消高德地图定位
11月28日下午,**百度地图今天公布了与四个北欧旅游局的战略合作,并公布了本月将在非洲.欧洲和亚洲推出的106个国家. 今年4月,百度地图正式发布了*对外开放国际化战略,并在年底宣传完成150多个国 ...
- Cordova高德地图定位、ionic2/3/4高德地图定位(解决部分国产手机无法定位的情况)
高德地图定位 (2.0.5版本) 插件环境 cordova-android >= 7.0.0 清晰的文档请看:点击转到github文档 1.申请密钥 请参照: 申请android密钥定位SDK ...
最新文章
- VR视觉健康标准在穗发布 专家:VR使用不要超过45分钟
- c++ -O1,-O2,-O3资料整理
- EditText 不弹出软件键盘
- Effective C# 学习笔记(八)多用query语法,少用循环
- 《用友ERP-U8(8.72版)标准财务模拟实训》——导读
- 百度优化有感,原创内容只是个传说
- android onscrolllistener判断到底部,android中RecycleView添加下滑到底部的监听示例
- 微软:推开窗户,我看到了云
- APScheduler——定时任务框架
- 小程序优化处理解决方案1 请求和setData
- 微信小程序弹框种类汇总
- 金狐超级软件盘 07.14更新
- android进入工程模式,安卓手机怎么进工程模式 安卓手机进工程模式教程【详解】...
- 苹果鼠标右键怎么按_iPadOS 13.4 鼠标体验如何?附使用指南
- 2021美团校招(一)
- SpringBoot的属性注入详解
- 使用快启动PE修复win10系统引导
- 【Pytorch深度学习实践】B站up刘二大人之SoftmaxClassifier-代码理解与实现(8/9)
- VS Code修改系统界面和编辑面板字体大小
- IoT 和 OT 设备是否适用零信任?
热门文章
- 城市规划数据—武汉市全部矢量+乡镇边界+POI数据
- 一文讲透云计算、大数据与人工智能三者之间的关系!
- 淘宝哪些退款原因会影响店铺?具体介绍
- 区块链投资需要多少钱?不再是空谈
- STM32单片机报错error: #20: identifier “TIM2_IRQn“ is undefined
- 天涯明月刀手游服务器版本信息,天涯明月刀手游合服计划公告
- 用PHPExcel读取excel文件内容
- UBT3:ubuntu安装Typora
- Vue项目原本原本http请求变成了https
- 《人力资源管理概论》