基于高德地图SDK的应用
技术:java
概述
基于高德地图SDK的应用,可导航以及地图基本功能
详细
一、需求
1、 地图
2、 导航
注意事项:此代码针对有AndroidStudio使用经验的人群使用
二、具体要求
1、地图基本功能
2、定位功能
3、POi点击功能
4、地理编码和逆地理编码
5、周边搜索
6、路径规划
7、导航策略选择
8、导航功能
三、使用方法
下载后直接导入AndroidStudio,根据相关提示,进行下一步操作
四、代码实现过程
1、 加入高德地图SDK
2、 配置build.gradle文件
3、 第三方库使用:'org.greenrobot:eventbus:3.0.0'
语音包:Msc.jar
4、 高德官方库JAR包:AMap3DMap_5.0.0_AMapNavi_5.0.1_AMapSearch_5.0.0_AMapLocation_3.4.0_20170427.jar
5、 需添加jnilibs支持库(demo中有,直接导入即可)
6、 其他详情,请根据ZIP压缩文件中的代码提示进行
五、主要代码结构
入口:MapActivity.java
子窗口Fragment:PoiInformationFragment.java/ PoiSearchPageFragment.java
导航:NavActivity.java
语音播报设置:TTSController.java
工具:AmapLocationTestUtil.java/ LogUtil.java/ MapUtil.java/ OffLineMapUtils.java
六、运行效果
七、部分代码演示
导航重要代码部分
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Window; import com.amap.api.navi.AMapNavi; import com.amap.api.navi.AMapNaviListener; import com.amap.api.navi.AMapNaviView; import com.amap.api.navi.AMapNaviViewListener; import com.amap.api.navi.AMapNaviViewOptions; import com.amap.api.navi.model.AMapLaneInfo; import com.amap.api.navi.model.AMapNaviCross; import com.amap.api.navi.model.AMapNaviInfo; import com.amap.api.navi.model.AMapNaviLocation; import com.amap.api.navi.model.AMapNaviPath; import com.amap.api.navi.model.AMapNaviTrafficFacilityInfo; import com.amap.api.navi.model.AimLessModeCongestionInfo; import com.amap.api.navi.model.AimLessModeStat; import com.amap.api.navi.model.NaviInfo; import com.amap.api.navi.model.NaviLatLng; import com.autonavi.tbt.NaviStaticInfo; import com.autonavi.tbt.TrafficFacilityInfo; import java.util.ArrayList; import java.util.List; public class NavActivity extends Activity implements AMapNaviListener,AMapNaviViewListener { AMapNaviView mAMapNaviView; AMapNavi mAMapNavi; NaviLatLng mEndLatlng = new NaviLatLng(xxxx, xxxx); NaviLatLng mStartLatlng= new NaviLatLng(xxxx, xxxxc);; List<NaviLatLng> mStartList = new ArrayList<NaviLatLng>(); List<NaviLatLng> mEndList = new ArrayList<NaviLatLng>(); List<NaviLatLng> mWayPointList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_basic_navi); mAMapNavi = AMapNavi.getInstance(getApplicationContext()); mAMapNavi.addAMapNaviListener(this); mAMapNavi.setEmulatorNaviSpeed(60); mAMapNavi.startNavi(AMapNavi.EmulatorNaviMode); //模拟导航模式 mAMapNaviView = (AMapNaviView) findViewById(R.id.navi_view); mAMapNaviView.onCreate(savedInstanceState); mAMapNaviView.setAMapNaviViewListener(this); setAmapNaviViewOptions(); } private void setAmapNaviViewOptions() { if (mAMapNaviView == null) { return; } AMapNaviViewOptions viewOptions = new AMapNaviViewOptions(); viewOptions.setSettingMenuEnabled(false);//设置菜单按钮是否在导航界面显示 viewOptions.setNaviNight(false);//设置导航界面是否显示黑夜模式 viewOptions.setReCalculateRouteForYaw(true);//设置偏航时是否重新计算路径 viewOptions.setReCalculateRouteForTrafficJam(true);//前方拥堵时是否重新计算路径 viewOptions.setTrafficInfoUpdateEnabled(true);//设置交通播报是否打开 viewOptions.setCameraInfoUpdateEnabled(true);//设置摄像头播报是否打开 viewOptions.setScreenAlwaysBright(true);//设置导航状态下屏幕是否一直开启。 viewOptions.setCrossDisplayEnabled(false); //设置导航时 路口放大功能是否显示 viewOptions.setTrafficBarEnabled(false); //设置 返回路况光柱条是否显示(只适用于驾车导航,需要联网) viewOptions.setMonitorCameraEnabled(true); //设置摄像头图标是否显示 是 // viewOptions.setLayoutVisible(false); //设置导航界面UI是否显示 //viewOptions.setNaviViewTopic(mThemeStle);//设置导航界面的主题 //viewOptions.setZoom(16); viewOptions.setTilt(0); //2D显示 mAMapNaviView.setViewOptions(viewOptions); } @Override protected void onResume() { super.onResume(); mAMapNaviView.onResume(); mStartList.add(mStartLatlng); mEndList.add(mEndLatlng); } @Override protected void onPause() { super.onPause(); // mAMapNavi.stopNavi(); } @Override protected void onDestroy() { super.onDestroy(); mAMapNaviView.onDestroy(); //since 1.6.0 //不再在naviview destroy的时候自动执行AMapNavi.stopNavi(); //请自行执行 mAMapNavi.stopNavi(); mAMapNavi.destroy(); } /** * 导航创建失败时的回调函数 */ @Override public void onInitNaviFailure() { Log.e("nav", "导航创建失败" ); } /** * 导航创建成功时的回调函数 */ @Override public void onInitNaviSuccess() { /** * 方法: * int strategy=mAMapNavi.strategyConvert(congestion, avoidhightspeed, cost, hightspeed, multipleroute); * 参数: * @congestion 躲避拥堵 * @avoidhightspeed 不走高速 * @cost 避免收费 * @hightspeed 高速优先 * @multipleroute 多路径 * * 说明: * 以上参数都是boolean类型,其中multipleroute参数表示是否多条路线,如果为true则此策略会算出多条路线。 * 注意: * 不走高速与高速优先不能同时为true * 高速优先与避免收费不能同时为true */ int strategy=0; try { strategy = mAMapNavi.strategyConvert(true,false,false,false, false); //自己设置。。 } catch (Exception e) { e.printStackTrace(); } mAMapNavi.calculateDriveRoute(mStartList, mEndList, mWayPointList, strategy); Log.e("nav", "导航创建成功" ); } /** * type - 导航类型,1 : 实时导航,2 :模拟导航 * @param type */ @Override public void onStartNavi(int type) { Log.e("nav", "启动导航后回调函数"+type ); } /** * 当前方路况光柱信息有更新时回调函数。 */ @Override public void onTrafficStatusUpdate() { } /** * 当GPS位置有更新时的回调函数 * @param location */ @Override public void onLocationChange(AMapNaviLocation location) { } /** * 导航播报信息回调函数 * type - 播报类型,包含导航播报、前方路况播报和整体路况播报,类型请见NaviTTSType * text - 播报文字 * @param type * @param text */ @Override public void onGetNavigationText(int type, String text) { String NavInformationText = text; //测试---fan } /** * 模拟导航停止后回调函数 */ @Override public void onEndEmulatorNavi() { Log.e("nav","模拟导航停止"); } /** * 到达目的地后回调函数 */ @Override public void onArriveDestination() { Log.e("nav", "到达目的地"); } /** * 到达目的地后回调函数(包含统计信息) * @param naviStaticInfo */ @Override public void onArriveDestination(NaviStaticInfo naviStaticInfo) { } /** * 步行或者驾车路径规划成功后的回调函数 */ @Override public void onCalculateRouteSuccess() { AMapNaviPath naviPath = mAMapNavi.getNaviPath(); if (naviPath == null) { return; } mAMapNavi.startNavi(AMapNavi.EmulatorNaviMode); Log.e("nav", "驾车路径规划成功" ); } /** * 步行或者驾车路径规划失败后的回调函数 * @param errorInfo */ @Override public void onCalculateRouteFailure(int errorInfo) { Log.e("nav", "驾车路径规划失败" +errorInfo); } /** * 步行或驾车导航时,出现偏航后需要重新计算路径的回调函数 */ @Override public void onReCalculateRouteForYaw() { } /** * 驾车导航时,如果前方遇到拥堵时需要重新计算路径的回调 */ @Override public void onReCalculateRouteForTrafficJam() { } /** * 驾车路径导航到达某个途经点的回调函数 * wayID - 到达途径点的编号,标号从1开始,依次累加。 模拟导航下不工作 * @param wayID */ @Override public void onArrivedWayPoint(int wayID) { } /** * 用户手机GPS设置是否开启的回调函数 * enabled - true,开启;false,未开启 * @param enabled */ @Override public void onGpsOpenStatus(boolean enabled) { } @Override public void onNaviInfoUpdated(AMapNaviInfo naviInfo) { } /** * 导航数据回调 ********重点 * 导航引导信息回调 naviinfo 是导航信息类 * naviinfo - 导航信息对象。 * @param naveinfo */ @Override public void onNaviInfoUpdate(NaviInfo naveinfo) { if (naveinfo == null) { return; } // 很多的数据 ,在这里得到 // 算是重点区域吧 } @Override public void OnUpdateTrafficFacility(TrafficFacilityInfo trafficFacilityInfo) { } @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo aMapNaviTrafficFacilityInfo) { } /** * 显示路口放大图回调 * aMapNaviCross - 路口放大图类,可以获得此路口放大图bitmap * @param aMapNaviCross */ @Override public void showCross(AMapNaviCross aMapNaviCross) { } /** * 关闭路口放大图回调 */ @Override public void hideCross() { } /** * 显示道路信息回调 * laneInfos - 道路信息数组,可获得各条道路分别是什么类型,可用于用户使用自己的素材完全自定义显示。 * laneBackgroundInfo - 道路背景数据数组,可用于装载官方的DriveWayView,并显示。 * laneRecommendedInfo - 道路推荐数据数组,可用于装载官方的DriveWayView,并显示。 * @param laneInfos * @param laneBackgroundInfo * @param laneRecommendedInfo */ @Override public void showLaneInfo(AMapLaneInfo[] laneInfos, byte[] laneBackgroundInfo, byte[] laneRecommendedInfo) { } /** * 关闭道路信息回调 */ @Override public void hideLaneInfo() { } /** * 多路线算路成功回调 * */ @Override public void onCalculateMultipleRoutesSuccess(int[] ints) { Log.e("nav","多路线算路成功回调"); } /** * 通知当前是否显示平行路切换 * parallelRoadType - 0表示隐藏 1 表示显示主路 2 表示显示辅路 * @param i */ @Override public void notifyParallelRoad(int i) { } /** * 巡航模式(无路线规划)下,道路设施信息更新回调 * infos - 道路设施信息 * @param aMapNaviTrafficFacilityInfos */ @Override public void OnUpdateTrafficFacility(AMapNaviTrafficFacilityInfo[] aMapNaviTrafficFacilityInfos) { } /** * 巡航模式(无路线规划)下,统计信息更新回调 连续5个点大于15km/h后开始回调 * aimLessModeStat - 巡航模式(无路线规划)下统计信息 * @param aimLessModeStat */ @Override public void updateAimlessModeStatistics(AimLessModeStat aimLessModeStat) { } /** * 巡航模式(无路线规划)下,统计信息更新回调 当拥堵长度大于500米且拥堵时间大于5分钟时回调 * @param aimLessModeCongestionInfo */ @Override public void updateAimlessModeCongestionInfo(AimLessModeCongestionInfo aimLessModeCongestionInfo) { } /**==================================================以下为AMapNaviViewListener监听回调======================================*/ /** * 界面右下角功能设置按钮的回调接口 */ @Override public void onNaviSetting() { } /** * 导航页面左下角返回按钮点击后弹出的『退出导航对话框』中选择『确定』后的回调接口 */ @Override public void onNaviCancel() { finish(); } /** * 导航页面左下角返回按钮的回调接口 false-由SDK主动弹出『退出导航』对话框,true-SDK不主动弹出『退出导航对话框』,由用户自定义 * @return */ @Override public boolean onNaviBackClick() { return false; } /** * 导航界面地图状态的回调 * isLock - 地图状态,0:车头朝上状态;1:非锁车状态,即车标可以任意显示在地图区域内。 * @param isLock */ @Override public void onNaviMapMode(int isLock) { } /** * 界面左上角转向操作的点击回调 */ @Override public void onNaviTurnClick() { } /** * 界面下一道路名称的点击回调 */ @Override public void onNextRoadClick() { } /** * 界面全览按钮的点击回调 */ @Override public void onScanViewButtonClick() { } /** * 是否锁定地图的回调 * @param b */ @Override public void onLockMap(boolean b) { } /** * 导航view加载完成回调 */ @Override public void onNaviViewLoaded() { } @Override protected void onStop() { super.onStop(); } }
八、项目结构图
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码