一.准备工作

1. 到高德地图官方网申请key: 我的应用 | 高德控制台

2. 申请key方法请参考:获取Key-创建工程-开发指南-Android 地图SDK | 高德地图API

3. 出现的问题:

其中有一个获取SHA1的问题:

E/AmapErr: 定位失败,7: KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信息:auth

7

KEY鉴权失败。

请仔细检查key绑定的sha1值与apk签名sha1值是否对应,或通过高频问题查找相关解决办法。

出现这类问题主要是SHA1不对,可以使用下面方法获取当前应用的SHA1,然后拿代码得到的SHA1和高德官网申请key填写的SHA比较是否正确.

public class SignSHA1Util {public static String sHA1(Context context){try {PackageInfo info = context.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(":");}String result  =  hexString.toString();return result.substring(0, result.length()-1);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}

另外一个问题:

如出现上面此类错误,则需要在代码中添加以下2句代码来解决:

MapsInitializer.updatePrivacyShow(this, true, true);MapsInitializer.updatePrivacyAgree(this, true);

二.实现方式

1. 模拟使用android studio开发,在build.gradele中添加

//3D地图so及jar和导航
implementation 'com.amap.api:navi-3dmap:latest.integration'
//定位功能
implementation 'com.amap.api:location:latest.integration'
//搜索功能
implementation 'com.amap.api:search:latest.integration'

2. 配置AndroidManifest.xml

首先,添加需要的权限

 <!--地图包、搜索包需要的基础权限--><uses-permission android:name="android.permission.INTERNET" /><!--允许程序设置内置sd卡的写权限--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允许程序获取网络状态--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!--允许程序访问WiFi网络信息--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!--允许程序读写手机状态和身份--><uses-permission android:name="android.permission.READ_PHONE_STATE" /><!--允许程序访问CellID或WiFi热点来获取粗略的位置--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--这个权限用于允许程序在手机屏幕关闭后后台进程仍然运行--><uses-permission android:name="android.permission.WAKE_LOCK"/>

然后,设置高德key

<meta-data android:name="com.amap.api.v2.apikey" android:value="开发者申请的key"/>

最后,添加定位服务

<service android:name="com.amap.api.location.APSService"></service>

3.地图显示

首先,添加布局控件

<com.amap.api.maps.MapView
android:id="@+id/mapView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintStart_toStartOf="parent"/>

然后,初始化地图显示就可以了

private void initMapView() {mapView = findViewById(R.id.mapView);mapView.onCreate(savedInstanceStateTemp);if (aMap == null) {aMap = mapView.getMap(); }
}

4.实时定位

首先,初始化定位参数,设置监听

private void initLocation() {MyLocationStyle myLocationStyle = new MyLocationStyle();
//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。myLocationStyle.interval(2000);
//定位蓝点展现模式,默认是LOCATION_TYPE_LOCATION_ROTATEmyLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
//设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。myLocationStyle.showMyLocation(true);
//设置定位蓝点的StyleaMap.setMyLocationStyle(myLocationStyle);
// 设置定位监听aMap.setLocationSource(this);
//设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。aMap.setMyLocationEnabled(true);
// 设置地图模式,aMap是地图控制器对象。1.MAP_TYPE_NAVI:导航地图 2.MAP_TYPE_NIGHT:夜景地图 3.MAP_TYPE_NORMAL:白昼地图(即普通地图) 4.MAP_TYPE_SATELLITE:卫星图aMap.setMapType(AMap.MAP_TYPE_NORMAL);
//设置默认定位按钮是否显示,非必需设置。aMap.getUiSettings().setMyLocationButtonEnabled(true);
//控制比例尺控件是否显示,非必须设置。aMap.getUiSettings().setScaleControlsEnabled(true);}

接着,实现AMap.setLocationSource监听器后,并且回调activate()和deactivate()两个方法。activate()方法是在**定位的时候触发,需要在里面初始化定位参数,并开始定位。deactivate()方法是在定位停止的时候触发,需要在方法里停止定位,避免不必要的资源浪费.

/*** **定位*/@Overridepublic void activate(LocationSource.OnLocationChangedListener onLocationChangedListener) {mListener = onLocationChangedListener;if (aMapLocationClient == null) {//初始化定位try {aMapLocationClient = new AMapLocationClient(this);//初始化定位参数aMapLocationClientOption = new AMapLocationClientOption();//设置定位回调监听aMapLocationClient.setLocationListener(this);//设置为高精度定位模式aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位参数aMapLocationClient.setLocationOption(aMapLocationClientOption);//启动定位aMapLocationClient.startLocation();} catch (Exception e) {e.printStackTrace();}}}/*** 停止定位*/@Overridepublic void deactivate() {mListener = null;if (aMapLocationClient != null) {aMapLocationClient.stopLocation();aMapLocationClient.onDestroy();}aMapLocationClient = null;}

最后,在定位回调中设置显示定位小蓝点,isFirstLocationn的作用是防止拖动地图后,定位小蓝点老是返回到屏幕的中心位置。

@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (mListener != null && aMapLocation != null) {this.aMapLocation = aMapLocation;if (aMapLocation.getErrorCode() == 0) {if (isFirstLocation) {aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));mListener.onLocationChanged(aMapLocation);// 显示系统小蓝点isFirstLocation = false;}} else {Log.e("TAG", "定位失败!!!");}}}

5.模拟导航

首先,添加模拟导航布局控件

<com.amap.api.navi.AMapNaviViewandroid:id="@+id/naviView"android:layout_width="wrap_content"android:layout_height="match_parent"android:visibility="gone"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintStart_toStartOf="parent"></com.amap.api.navi.AMapNaviView>

接着,初始化模拟导航对象,并设置监听

 private void initMapNaviView() {aMapNaviView = findViewById(R.id.naviView);mapView.setVisibility(View.GONE);aMapNaviView.setVisibility(View.VISIBLE);aMapNaviView.onCreate(savedInstanceStateTemp);aMapNaviView.setAMapNaviViewListener(SceneThirdActivity.this);//获取AMapNavi实例try {aMapNavi = AMapNavi.getInstance(SceneThirdActivity.this);} catch (AMapException e) {e.printStackTrace();}//添加监听回调,用于处理算路成功aMapNavi.addAMapNaviListener(SceneThirdActivity.this);aMapNavi.addParallelRoadListener(SceneThirdActivity.this);}

然后,计算步行规划路线,AMapNavi对象初始化成功后,会触发onInitNaviSuccess方法

@Overridepublic void onInitNaviSuccess() {LogUtil.d(TAG, "*****#####onInitNaviSuccess================");int strategy = 0;try {//再次强调,最后一个参数为true时代表多路径,否则代表单路径strategy = aMapNavi.strategyConvert(true, false, false, false, false);} catch (Exception e) {e.printStackTrace();}//设置模拟导航的行车速度aMapNavi.setEmulatorNaviSpeed(75);sList.add(mStartLatlng);eList.add(mEndLatlng);mWayPointList.add(new NaviLatLng(39.925846, 116.442765));aMapNavi.calculateDriveRoute(sList, eList, mWayPointList, strategy);}@Overridepublic void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteResult) {LogUtil.d(TAG, "*****#####onCalculateRouteSuccess================");aMapNavi.startNavi(NaviType.EMULATOR);}

需要注意点:Activity销毁的时候调用AMapNavi的stopNavi()和destory()方法,来停止导航,否则再次导航时会出现AMapNavi初始化失败的问题!

    @Overrideprotected void onResume() {super.onResume();aMapNaviView.onResume();}@Overrideprotected void onPause() {super.onPause();aMapNaviView.onPause();}protected void onDestroy() {super.onDestroy();mapView.onDestroy();aMapNaviView.onDestroy();//since 1.6.0 不再在naviview destroy的时候自动执行AMapNavi.stopNavi();请自行执行aMapNavi.stopNavi();aMapNavi.destroy();}

如果需要导航语音的话,调用SETUSEINNERVOICE()方法即可实现。

aMapNavi.setUseInnerVoice(true);

Android 整合高德地图SDK实现 地图预览,定位,模拟导航相关推荐

  1. Android中集成高德地图SDK实现地图定位和导航功能(二)

    我们接着上一篇文章开始继续实现android中集成高德地图的SDK实现地图 定位,搜索,导航的功能 如何让地图在手机上实现呢? 1.配置AndroidManifest 中的权限申请 可以参考官方文档 ...

  2. Android中集成高德地图SDK实现地图定位和导航功能(一)

    一.前期准备工作 1.在高德地图开发者平创建一个自己的项目 名称和应用类型随便填 2.添加Key 1.添加key 2.获取SHA1值 2.1.使用windwos+R 输入cmd 打开控制窗口 输入 w ...

  3. 基于百度地图sdk的地图app开发(七)——导航和模拟导航

    这是基于百度地图sdk的地图app开发系列博客第七篇 代码仓库位置:https://github.com/YanhuiLu89/lmap.git 上一篇 基于百度地图sdk的地图app开发(六)--路 ...

  4. 关于百度地图SDK的andriod开发的定位功能实现

    基于Android Studio的汽车定位追踪系统的设计 摘要:随着经济的发展和汽车化时代的到来,人们对于车辆的服务的智能化,便捷化提出了更高的要求.文章主要研究通过软件编写一个汽车定位追踪系统,并利 ...

  5. geoserver发布地图服务后不能预览,竟然变成下载WMS文件

    geoserver发布地图服务后不能预览,竟然变成下载WMS文件 问题描述:geoserver发布地图服务后不能预览,竟然变成下载WMS文件,用记事本打开下载文件显示错误信息:java.lang.Nu ...

  6. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决

    Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...

  7. Android 音视频开发(三) -- Camera2 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  8. Android 音视频开发(二) -- Camera1 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  9. 二、JAVA调用海康威视SDK实现摄像头预览完整版

    接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...

最新文章

  1. XP/Vista 彻底休矣!Firefox 浏览器放弃支持
  2. 使用C语言和i2c-dev驱动
  3. hadoop集群配置文件与功能对应解析
  4. 从对话框中传递参数到视图类
  5. spring学习(44):p名称空间注入
  6. 看脸 高效学英语 下
  7. python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析
  8. clickhouse官方文档_clickhouse分析:zookeeper减压概述
  9. excel打开空白不显示内容 没有隐藏_办公软件操作技巧097:如何隐藏excel表格中没有数据的空白区域...
  10. Windows 10版本business_editions和consumer_editions的区别?
  11. TensorFlow入门篇(二):线性回归
  12. koa2 mysql增删改查_使用nodejs-koa2-mysql-sequelize-jwt实现登录注册,文章增删改查接口...
  13. Navicat Premium MAC版本破解
  14. 图片传输到ipfs节点然后将生成的ipfs访问链接存到区块链
  15. matlab trangle,Triangle-of-Point-Cloud Matlab 三维点云三角化 不是平面域的三角化 是三维点云三角化 亲身测试绝对可用! - 下载 - 搜珍网...
  16. 软件开发新技术(工具及相关技术)
  17. vue 重写element input限制字数
  18. 主机宝iis版_主机宝IIS版|IIS网站宝(IIS科技主机管理系统)下载 v3.0 官方免费版 - 比克尔下载...
  19. OKR目标与关键结果法
  20. MediaPlayer读取手机内存文件夹权限问题

热门文章

  1. 教你如何在社会上“混”
  2. 删除电脑被占用的串口
  3. Flutter 启动白屏
  4. php 正方,php 模拟登陆正方教务系统
  5. tplogin 服务器未响应,为什么tplogin.cn老是域名解析错误
  6. 浮沙筑塔——protues仿真C51程序之LED灯闪烁
  7. 抖音上几百万粉丝的能有什么用?
  8. 滤波反投影重建算法(FBP)实现及应用(matlab)
  9. C++内存管理机制—Primitives笔记
  10. 简单实用!一文掌握效度分析所有知识点!