一、 要实现高德地图定位呢,首先需要做好以下几步准备:
1. 在高德开放平台注册帐号
注册地址:http://lbs.amap.com
2. 在开发中下载Android平台下的地图SDK和定位SDK文件
进入相关下载下载自己想要的功能或文件,图只是截取了地图SDK的页面,定位SDK也是一样,按自己想要的文件下载。下载完成后解压得到:
- 3D地图包解压后得到:3D地图显示包“AMap_3DMap_VX.X.X_时间.jar”和库文件夹(包含armeabi、arm64-v8a等库文件)。
- 2D地图包解压后得到:2D地图显示包“AMap_2DMap_VX.X.X_时间.jar ”
- 定位SDK下载并解压得到定位包“AMap_Location_V2.x.x.jar“
3. 添加jar包,将jar包放入工程的libs目录下。
对于每个jar文件,右键-选择Add As Library,导入到工程中。或者使用菜单栏 选择 File ->Project Structure->Modules-> Dependencies。点击绿色的加号选择File dependency. 然后选择要添加的jar包即可,此时build.gradle中会自动生成如下信息。
4. 申请API KEY
进入控制台
创建自己的应用(创建过程内需要的SHA1已经的博客讲过)
开发环境已经配置好了,接下来就是敲代码了。
二、 首先我们要做的就是将地图显示出来,通过以下几步操作,即可在应用中使用高德地图SDK:
第一步:添加用户key 在工程的“ AndroidManifest.xml ”文件如下代码中添加您的用户 Key。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="c9df032baec3ec50b1e089768ea4672b" />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第二步:添加所需权限 在工程的“ AndroidManifest.xml ”文件中进行添加。
//地图包、搜索包需要的基础权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
//定位包、导航包需要的额外权限(注:基础权限也需要)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
第三步:在布局xml文件中添加地图控件。
<com.amap.api.maps2d.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- 1
- 2
- 3
- 4
第四步,创建地图Activity,管理地图生命周期。
public class MainActivity extends Activity {
private MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map_view);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mMapView.onCreate(savedInstanceState);
}
@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();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
mMapView.onSaveInstanceState(outState);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
注意:一定要有mMapView.onCreate(savedInstanceState);
运行一下,效果如下:
三、接下来就是实现定位了,定位也需要通过以下几步操作完成:
第一步:配置AndroidManifest.xml
1.在application标签中声明service组件,每个app拥有自己单独的定位service。
<service android:name="com.amap.api.location.APSService"/>
- 1
2.接下来声明使用权限
<!--用于进行网络定位-->
<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" />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
第二步:启动定位功能:
1. 在主线程中获得地图对象AMap,并设置定位监听且实现LocationSource接口:
- 1
- 2
public class MainActivity extends Activity implements LocationSource{
- 1
if (aMap == null) {
aMap = mMapView.getMap();
//设置显示定位按钮 并且可以点击
UiSettings settings = aMap.getUiSettings();
aMap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口
// 是否显示定位按钮
settings.setMyLocationButtonEnabled(true);
aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2. 配置定位参数,启动定位
- 1
- 2
//初始化定位
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);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
-
高精度定位模式:
在这种定位模式下,将同时使用高德网络定位和GPS定位,优先返回精度高的定位
- 1
- 2
-
低功耗定位模式:
在这种模式下,将只使用高德网络定位
- 1
- 2
-
仅设备定位模式:
在这种模式下,将只使用GPS定位。 3. 实现AMapLocationListener接口,获取定位结果:
- 1
- 2
- 3
- 4
public class MainActivity extends Activity implements LocationSource, AMapLocationListener {
- 1
@Override
public 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();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
4.关于停止定位
- 1
- 2
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
//mLocationClient.stopLocation();//停止定位
mLocationClient.onDestroy();//销毁定位客户端。
//销毁定位客户端之后,若要重新开启定位请重新New一个AMapLocationClient对象。
}
//激活定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
-
-
a274191047
2017-09-09 23:11 5楼 -
写的很好,借用了,谢谢!
-
-
-
-
Wyt9431
2017-04-10 14:39 4楼 -
写得很详细!感谢
-
-
-
-
qq_33923079
2017-03-09 11:18 3楼 -
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="c9df032baec3ec50b1e089768ea4672b" />
APIKey一不小心暴露了吧,其实也没啥用,每个人都可以申请 -
-
相关文章推荐
-
unity地形编辑扩展插件Landspace Auto Material介绍
LAM是一套针对复杂地形和植物的编辑工具, 增加了一些unity自带地形编辑器没有的功能, 对其用法做一下简单介绍。- dark00800
- 2017-03-05 23:01
- 3329
-
关注CSDN程序人生公众号,轻松获得下载积分
关注公众号 在公众号里回复“”秘密“”两个字 返回 http://task.csdn.net/m/task/home?task_id=398 领取奖励提示:根据公众号里的自动回复,完成...- baiyuzhong2012
- 2016-11-24 16:29
- 152093
-
程序员爱Python吗?两统计平台结果争议!
对于程序员来说,哪个才是最优秀的编程语言一直有争议。而日前我们却被一条消息刷屏:发达国家的程序员更爱Python。一石激起千层浪,全球的程序员对待 Python究竟是何种态度...
-
面试题:8个试剂,其中一个有毒,最少多少只小白鼠能检测出有毒试剂
面试题:8个试剂,其中一个有毒,最少多少只小白鼠能检测出有毒试剂方法1:用3只小鼠,能组合成8种状态。第一只喂食【1、3、5、7】四只试剂第二只喂食【2、3、6、7】四只试剂第三只喂食【4、5、...- u010429424
- 2017-09-05 21:08
- 3699
-
史上最简单的 MySQL 教程(三)「 MySQL 数据库」
MySQL 数据库MySQL 数据库是一种C\S结构的软件,即分为:客户端和服务端。若想访问服务器,必须通过客户端;服务器应该一直运行,客户端则在需要使用的时候运行。- qq_35246620
- 2017-04-28 10:57
- 2874
-
Android开发笔记----高德地图定位
获取用户当前位置,需要配合定位SDK一起使用,本人在使用过程中,发现新旧版本的定位SDK差别很大,本人推荐使用旧版本的SDK,因为网上的许多教程都是使用旧版本的SDK进行讲解的,网上下载的源码大多数也...- a946898963
- 2016-03-02 19:47
- 457
-
高德地图android开发实例
- 2013-09-17 14:31
- 507KB
- 下载
-
最新基于高德地图的android进阶开发(4)GPS定位之POI(Point of interesting)兴趣点源码简介
1.跑了一下高德提供的POI的源码,感觉还是比较简单的,没有达到想要的效果,还有改进的空间,后面会继续更新。2.下面直接上代码,已经注释好了main.javapackage com.dragon.ar...- yywan1314520
- 2016-07-19 16:43
- 1235
-
高德地图LBS开发定位--android客户端
*高德地图LBS开发定位–android客户端(一)*这个几乎是所有开放平台都通用的做法,无外乎注册帐号,成为开发者,然后创建一个Android应用,会为你分配一个key绑定你的服务。注册网址 环境...- PrettyDie
- 2016-05-25 11:18
- 737
-
高德地图 android api 实现自动定位
未经允许,禁止转载,违者必究!浣熊我最近在研究高德地图android api,看到第三章定位信息后半部分关于“如何通过MyLocationOverlay 实现自动定位”的时候我凌乱了,写得过于简单...- yuanbohx
- 2013-03-28 16:17
- 42073
-
android中借助高德地图sdk实现基本的定位
android中借助高德地图sdk实现基本的定位- coding_p
- 2017-03-28 20:36
- 703
-
Android——高德地图实现多点连线与点击定位监听实现
最近开发的项目中需要使用到的功能,如下图所示:服务器会传来一个包含项数据类型为坐标与时间的数组。需要实现的功能有:1.按时间顺序对每个点进行连线。2.点击单个点会在点的上分di...- qq_22770457
- 2016-12-07 22:37
- 1807
-
android开发中高德地图点聚合自定义聚合点的样式
高德点聚合- version1_0
- 2017-05-16 18:17
- 965
-
android开发中使用高德地图出现的一些问题
作为一名android开发者,地图这一块应该很多人都有碰过,我这里也简述一些自己使用碰到的一些问题(主要是高德地图 不是很喜欢百度地图)1.在使用高德地图的过程中,是要先申请key的 对应一个ap...- CallMeJason
- 2016-01-01 18:06
- 4499
-
高德地图Android开发-环境配置
Android地图SDK简介高德地图 Android SDK 是一套地图开发调用接口,开发者可以轻松地在自己的Android应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互...- qq_38038931
- 2017-05-11 17:19
- 84
在线课程
-
讲师:王哲涵
-
讲师:韦玮
热门文章
- 如何使用百度天气预报API接口
27684
- Android开发实现高德地图定位详解
23455
- 7246
- Android开发之实现百度地图定位功能
5163
- 利用事件分发机制解决ScrollView嵌套ListView滑动冲突
4127