最近学习使用高德地图可谓是出师不利。。。。嘛,不知道为啥高德给的3d地图的jar包用不了,最后实在没办法用了2d的jar包,然后在大佬和其他资料的帮助下,实现了高德地图的定位功能。接下来就说一下具体的步骤。

方法1:通过拷贝集成SDK

1、拷贝 jar 文件至 libs 文件夹下

将下载的定位 SDK jar 文件复制到工程(此处截图以官方示例Demo为例子)的 libs 目录下,如果有老版本定位 jar 文件存在,请删除。定位 SDK 无需 so 库文件支持。如图所示:

2、配置 build.gradle 文件

在 build.gradle 文件的 dependencies 中配置 compile fileTree(include: ['*.jar'], dir: 'libs')。

方法2:通过Gradle集成SDK

1、在Project的build.gradle文件中配置repositories,添加maven或jcenter仓库地址

Android Studio默认会在Project的build.gradle为所有module自动添加jcenter的仓库地址,如果已存在,则不需要重复添加。Project的build.gradle文件在Project目录中位置如图所示:
配置如下:
allprojects {repositories {jcenter() // 或者 mavenCentral()}}

2、在主工程的build.gradle文件配置dependencies

根据项目需求添加SDK依赖。引入各个SDK功能最新版本, dependencies 配置方式如下:

SDK

引入代码

3D地图

compile 'com.amap.api:3dmap:latest.integration'

2D地图

compile 'com.amap.api:map2d:latest.integration'

导航

compile 'com.amap.api:navi-3dmap:latest.integration'

搜索

compile 'com.amap.api:search:latest.integration'

定位

compile 'com.amap.api:location:latest.integration'

主工程的build.gradle文件在Project目录中位置:
注意:千万别在Gradle里集成后再去add as library 会出现jar包重复的问题。
还有测试一定要用真机。。一定要用真机。。一定要用真机。重要的事要说3遍。之前没用真机一直重复报一个看都看不懂的错,贼难受,结果插上真机还是能正常运行的。。。。
在下载并添加好高德所提供的jar包并添加依赖后我们就可以开始进行定位了。
public class MainActivity extends CheckPermissionsActivity implements LocationSource,AMapLocationListener{private AMap aMap;private MapView mapView;private AMapLocationClient mLocationClient=null;private AMapLocationClientOption mLocationOption=null;private OnLocationChangedListener mListener=null;private boolean isFirstLoc=true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mapView=(MapView)findViewById(R.id.map);mapView.onCreate(savedInstanceState);if(aMap==null){aMap=mapView.getMap();UiSettings settings = aMap.getUiSettings();aMap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口// 是否显示定位按钮settings.setMyLocationButtonEnabled(true);aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flaseMyLocationStyle myLocationStyle = new MyLocationStyle();aMap.setMyLocationStyle(myLocationStyle);//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位回调监听,这里要实现AMapLocationListener接口,AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。mLocationClient.setLocationListener(this);//初始化定位参数mLocationOption = new AMapLocationClientOption();//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置是否返回地址信息(默认返回地址信息)mLocationOption.setNeedAddress(true);//设置是否只定位一次,默认为falsemLocationOption.setOnceLocation(false);//设置是否强制刷新WIFI,默认为强制刷新mLocationOption.setWifiScan(true);//设置是否允许模拟位置,默认为false,不允许模拟位置mLocationOption.setMockEnable(false);//设置定位间隔,单位毫秒,默认为2000msmLocationOption.setInterval(2000);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}}@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);//定位时间aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。aMapLocation.getCountry();//国家信息aMapLocation.getProvince();//省信息aMapLocation.getCity();//城市信息aMapLocation.getDistrict();//城区信息aMapLocation.getStreet();//街道信息aMapLocation.getStreetNum();//街道门牌号信息aMapLocation.getCityCode();//城市编码aMapLocation.getAdCode();//地区编码// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置if (isFirstLoc) {//设置缩放级别aMap.moveCamera(CameraUpdateFactory.zoomTo(17));//将地图移动到定位点aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));//点击定位按钮 能够将地图的中心移动到定位点mListener.onLocationChanged(aMapLocation);//获取定位信息/*StringBuffer buffer = new StringBuffer();buffer.append(aMapLocation.getCountry() + ""+ aMapLocation.getProvince() + ""+ aMapLocation.getCity() + ""+ aMapLocation.getProvince() + ""+ aMapLocation.getDistrict() + ""+ aMapLocation.getStreet() + ""+ aMapLocation.getStreetNum());Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();*/isFirstLoc = false;}} else {//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());Toast.makeText(getApplicationContext(), "定位失败", Toast.LENGTH_LONG).show();}}}@Overridepublic void activate(OnLocationChangedListener onLocationChangedListener) {mListener = onLocationChangedListener;}@Overridepublic void deactivate() {mListener = null;}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();//mLocationClient.stopLocation();//停止定位mLocationClient.onDestroy();//销毁定位客户端。//销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。}}
Androidmanifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.lenovo.mymap" ><!--用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--用于获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!--用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><!--用于访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET"/><!--用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!--用于写入缓存数据到扩展存储卡--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--用于申请调用A-GPS模块--><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/><!--用于申请获取蓝牙信息进行室内定位--><uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.AppCompat.NoActionBar" ><meta-data android:name="com.amap.api.v2.apikey" android:value="f7a523f80e43d197ef019aad4edeeec8">//开发者申请的key</meta-data><activity android:name=".MainActivity" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="com.amap.api.location.APSService"/></application></manifest>

这里我们用到了高德官网所提供的demo里申请权限的activity。
CheckPermissionsActivity:
public class CheckPermissionsActivity extends Activity {/*** 需要进行检测的权限数组*/protected String[] needPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE};private static final int PERMISSON_REQUESTCODE = 0;/*** 判断是否需要检测,防止不停的弹框*/private boolean isNeedCheck = true;@Overrideprotected void onResume() {super.onResume();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {if (isNeedCheck) {checkPermissions(needPermissions);}}}/*** * @param permissions* @since 2.5.0**/private void checkPermissions(String... permissions) {try {if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23) {List<String> needRequestPermissonList = findDeniedPermissions(permissions);if (null != needRequestPermissonList&& needRequestPermissonList.size() > 0) {String[] array = needRequestPermissonList.toArray(new String[needRequestPermissonList.size()]);Method method = getClass().getMethod("requestPermissions", new Class[]{String[].class,int.class});method.invoke(this, array, PERMISSON_REQUESTCODE);}}} catch (Throwable e) {}}/*** 获取权限集中需要申请权限的列表* * @param permissions* @return* @since 2.5.0**/private List<String> findDeniedPermissions(String[] permissions) {List<String> needRequestPermissonList = new ArrayList<String>();if (Build.VERSION.SDK_INT >= 23&& getApplicationInfo().targetSdkVersion >= 23){try {for (String perm : permissions) {Method checkSelfMethod = getClass().getMethod("checkSelfPermission", String.class);Method shouldShowRequestPermissionRationaleMethod = getClass().getMethod("shouldShowRequestPermissionRationale",String.class);if ((Integer)checkSelfMethod.invoke(this, perm) != PackageManager.PERMISSION_GRANTED|| (Boolean)shouldShowRequestPermissionRationaleMethod.invoke(this, perm)) {needRequestPermissonList.add(perm);}}} catch (Throwable e) {}}return needRequestPermissonList;}/*** 检测是否所有的权限都已经授权* @param grantResults* @return* @since 2.5.0**/private boolean verifyPermissions(int[] grantResults) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}@TargetApi(23)public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] paramArrayOfInt) {if (requestCode == PERMISSON_REQUESTCODE) {if (!verifyPermissions(paramArrayOfInt)) {isNeedCheck = false;}}}}
到此结束。。。。。ojbk。

利用高德地图实现定位功能相关推荐

  1. ios 高德获取定位_解决ios11不支持高德地图API定位功能的方法

    在 iOS 11 系统上访问JS API定位业务失败怎么解决? 苹果新发的 iOS 11 操作系统的一大特性是对 http 形式访问页面的限制变得非常严格(相比iOS 10 和 iOS 9).高德提供 ...

  2. 利用高德地图javascriptAPI实现模仿滴滴打车定位

    利用高德地图javascriptAPI实现模仿滴滴打车定位 使用API AMap.Map:地图对象类,封装了地图的属性设置.图层变更.事件交互等接口的类. AMap.Geocoder:地理编码与逆地理 ...

  3. 【应用】Python利用高德地图经纬度数据绘制定位

    [应用]Python利用高德地图经纬度数据绘制定位 一. 背景 二. 获取API 1. 注册高德开放平台个人开发者 2. 获取key 三. 具体步骤 1. 库的导入 2. 根据地址获取经纬度 3. 绘 ...

  4. Android学习之高德地图的通用功能开发步骤(二)

    周一又来了,我就接着上次的开发步骤(一)来吧,继续把高德地图的相关简单功能分享一下 上次写到了第六步,接着写第七步吧. 第七步:定位 + 地图选点 + 路径规划 + 实时导航 以下是我的这个功能Nav ...

  5. python做地图导航_「Python」利用高德地图做你想做之事

    玩grasshopper基本上都知道OpenStreetMap 这个地图网站,毕竟有一个好用的地图插件,可以在Rhino中绘制出所需,但是一个不好的地方就在于国内的数据量太少,无法满足我们的需求. 此 ...

  6. python做地图导航_【Python】利用高德地图做你想做之事

    原标题:[Python]利用高德地图做你想做之事 [版权声明] 作者:CPF 如需转载请联系CPF 如有侵权请联系大水牛平台 玩grasshopper基本上都知道OpenStreetMap 这个地图网 ...

  7. 「Python」利用高德地图做你想做之事

    玩grasshopper基本上都知道OpenStreetMap 这个地图网站,毕竟有一个好用的地图插件,可以在Rhino中绘制出所需,但是一个不好的地方就在于国内的数据量太少,无法满足我们的需求. 此 ...

  8. 手机端或PC端利用高德地图和腾讯地图获取用户当前位置信息

    目录 一.简介 二.高德地图 三.腾讯地图 四.总结 一.简介 最近在项目中,有需要使用到获取用户当前地理位置信息的功能,获取当前用户位置保存到数据库中的场景,并且需要支持多种地图定位方式,我这里采用 ...

  9. AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能

    在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...

最新文章

  1. 细分领域继续进击,海尔电器寻退市增效?
  2. REDIS实践之请勿踩多进程共用一个实例连接的坑
  3. MATLAB函数 zp2tf详解
  4. windows串口控制linux,是这个linux的串口配置与windows相同
  5. redis5 外部不能连接_基本拧紧技术,螺纹连接也有大不同!
  6. 用CSS3制作50个超棒动画效果教程
  7. linux-uboot 移植四 uboot的移植
  8. JAVA网络编程个人笔记 第五章 URL和URI
  9. 【数据结构初阶-oj】入门二叉树的入门oj
  10. 秒杀于丹、蒋勋、蒙曼,每篇都有10万+的潜质。《六神磊磊读唐诗》,5星。
  11. 在线Java/C++/C语言/Python/web网页编辑器(IDE)整理
  12. Anaconda虚拟环境使用及包管理
  13. 【实战练习】汽油辛烷值优化建模(二)(问题一的详细讲解)
  14. readyState的值的含义
  15. matlab处理采集的声音数据
  16. [编译原理读书笔记][第4章 语法分析]
  17. 在vue项目中使用supermap,基于 SuperMap iClient 8C(2017) for JavaScript,底图为天地图
  18. shell批量修改文件后缀名
  19. Qt5.13.0虚拟键盘 使用文档说明及函数说明 (一)构建 build
  20. 2021-10-18血压计方案|血压计模块

热门文章

  1. Hystrix实现熔断降级
  2. 数字信号处理matlab相关实验
  3. Kali 下对安卓手机的攻击
  4. 企业债券的发行与承销
  5. error MSB4184: 无法计算表达式
  6. 总结教训:stm32f4-Discovery驱动三星s6d1121液晶程序
  7. 从网页复制图片到word不显示的解决办法
  8. mysql设置固定ip地址访问_mysql设置指定ip访问,用户权限相关操作
  9. 如何运用政务智慧引导系统提升群众办事效率
  10. android 外接扫码枪_Android手机(设备)连接扫描枪扫码遇到的问题