哈~ 好久没来记笔记了,由于接手的他人的公司的项目集成了高德地图定位,突发心血来潮,也来体验体验这个过程了。
浏览器搜索高德定位,进入高德开放平台,注册一个账号,当然有高德开放平台账号的话就不用注册了,登录就OK
-
首先 进入自己账户的控制台,获取Key,进入自己账户的控制台,创建一个新应用。如果之前创建过应用,可直接跳过。
添加新Key(这里需要获取SHA1,我的demo使用就是AS自带的debug签名文件,按照官方的教程获取它,然后把资料填写完整)
然后就能在控制台看到自己申请的 Key 啦~
-
接下来 下载sdk了,我就下了个定位SDK,现在的版本是V3.7.0
-
将jar包放入项目中lib下面,配置好 build.gradle 文件(我这里使用的是拷贝jar包的方式,当然官方开发文档上还有添加SDK依赖的方式)
-
添加高德 Key 打开项目的 AndroidManifest.xml 文件中,添加代码,声明service(每个app拥有自己单独的定位service),当然把刚刚申请到的key填充进去:
声明权限
<!--用于进行网络定位-->
<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" />
有关代码混淆,我这demo不需要代码混淆了,如果需要的话,开发文档上有详细怎么配置(http://lbs.amap.com/api/android-location-sdk/guide/create-project/dev-attention)
最后 写代码开始了
写了个专门定位的类,然后使用方法就是在需要定位的Acitivity或者Fragment implement LocationCallBack 即可
public class MapLocationHelper implements AMapLocationListener {
/**
* 声明mlocationClient对象
*/
private AMapLocationClient mLocationClient;
/**
* 声明mLocationOption对象
*/
public AMapLocationClientOption mLocationOption = null;
private LocationCallBack mLocationCallBack;
private Context mContext;
public MapLocationHelper(Context context) {
mContext = context;
initLocation();
}
public MapLocationHelper(Context context, LocationCallBack locationCallback) {
mContext = context;
mLocationCallBack = locationCallback;
initLocation();
}
/**
* 初始化定位参数
*/
private void initLocation() {
mLocationClient = new AMapLocationClient(mContext);
mLocationOption = new AMapLocationClientOption();
// 设置定位监听
mLocationClient.setLocationListener(this);
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
// 设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
// 设置定位参数
mLocationClient.setLocationOption(mLocationOption);
}
/**
* 设置回调
* @param locationCallBack
*/
public void setLocationCallBack(LocationCallBack locationCallBack){
mLocationCallBack = locationCallBack;
}
/**
* 开启定位
*/
public void startMapLocation() {
if (!mLocationClient.isStarted()) {
mLocationClient.startLocation();
}
}
/**
* 停止定位服务
*/
public void stopMapLocation() {
if (mLocationClient.isStarted()) {
mLocationClient.stopLocation();
}
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
// 可在其中解析amapLocation获取相应内容。
mLocationCallBack.onCallLocationSuc(aMapLocation);
stopMapLocation();
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
stopMapLocation();
}
} else {
stopMapLocation();
}
}
}
public interface LocationCallBack {
void onCallLocationSuc(AMapLocation location);
}
使用定位:
初始化:
MapLocationHelper helper = new MapLocationHelper(this, this);
helper.startMapLocation();
拿到定位数据:
@Override
public void onCallLocationSuc(AMapLocation location) {
Log.d(TAG, "Address:" + location.getAddress());
Log.d(TAG, "City:" + location.getCity());
Log.d(TAG, "CityCode:" + location.getCityCode());
Log.d(TAG, "Country:" + location.getCountry());
Log.d(TAG, "Province:" + location.getProvince());
Log.d(TAG, "Latitude:" + location.getLatitude());
Log.d(TAG, "Longitude:" + location.getLongitude());
}
打印结果:OK!完结了!