第一步:添加高德定位SDK依赖,导入框架有两种方式,第一种是可以到高德开放平台高德开放平台 | 高德地图API下载相关的jar包,然后将jar包放在项目的libs文件下,然后点击以依赖库的形式添加到项目中;第二种是直接通过添加依赖的形式远程下载相关的文件:
implementation files('libs\\AMap_Location_V5.6.1_20211115.jar')
在安卓8之后,权限的申请分为静态申请和动态申请两种,使用定位功能需要获取设备的位置信息权限,安卓8之后位置信息权限不能通过静态申请的方式获得,这就需要进行动态申请位置信息权限:
首先需要在配置文件中添加以下必要权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
然后在Activity中进行权限获取情况进行判断,在没有获得位置信息权限的情况下需要进行权限申请:
/**
* 定位需要的权限
*/
private String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION
, Manifest.permission.ACCESS_COARSE_LOCATION
, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS};
private static final int OPEN_SET_REQUEST_CODE = 100;
//先进行权限申请情况判断,没有权限申请权限
if (lacksPermission(permissions)) {
ActivityCompat.requestPermissions(this, permissions, OPEN_SET_REQUEST_CODE);
} else {
Log.i("LoginActivity", "");
}
//判断是否获取权限
public boolean lacksPermission(String[] permissions) {
for (String permission : permissions) {
//判断是否缺少权限,true=缺少权限
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return true;
}
}
return false;
}
在使用定位SDK前需要将从高德开发平台申请到的key放到配置文件中的application层级下:
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你申请的key" />
在使用任何一个SDK接口前都需要进行以下两个配置(这个非常重要,不做配置将无法使用定位功能):
AMapLocationClient.updatePrivacyShow(getApplicationContext(), true, true);
AMapLocationClient.updatePrivacyAgree(getApplicationContext(), true);
最后定位功能可实现的一个LocationSrvice中,并实现位置信息监听接口,然后重写onLocationChanged方法,在方法中即可获取到位置信息,并对位置信息进行解析,比如解析成城市街道门牌号数据。注意需要在onDestroy()方法中进行资源释放:注销掉定位客户端。
public class LocationService extends Service implements AMapLocationListener {
private final String TAG = "LocationService";
private AMapLocationClient aMapLocationClient = null;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startLocation();
return super.onStartCommand(intent, flags, startId);
}
/**
* 配置定位服务参数
*
* @param start true表示开启定位服务 false表示销毁定位服务
*/
private void locationConfigure(boolean start) {
if (start) {
Log.i(TAG, "aMapLocation:开启定位服务");
try {
aMapLocationClient = new AMapLocationClient(getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}
//设置定位回调监听,这里要实现AMapLocationListener接口,AMapLocationListener接口只有onLocationChanged方法可以实现,用于接收异步返回的定位结果,参数是AMapLocation类型。
aMapLocationClient.setLocationListener(this);
//初始化定位参数
AMapLocationClientOption aMapLocationClientOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
aMapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
aMapLocationClientOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
aMapLocationClientOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
aMapLocationClientOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
aMapLocationClientOption.setMockEnable(false);
//设置定位间隔,单位毫秒,半小时定位一次
aMapLocationClientOption.setInterval(1000 * 60 * 30);
//给定位客户端对象设置定位参数
aMapLocationClient.setLocationOption(aMapLocationClientOption);
//启动定位
aMapLocationClient.startLocation();
} else {
if (aMapLocationClient != null) {
aMapLocationClient.onDestroy();
Log.i(TAG, "aMapLocation:关闭定位服务");
}
}
}
/**
* 位置信息
*
* @param aMapLocation 具体位置信息对象
*/
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
String device_addr = aMapLocation.getCountry()//国家信息
+ aMapLocation.getProvince()//省份信息
+ aMapLocation.getCity()//城市信息
+ aMapLocation.getDistrict()//区信息
+ aMapLocation.getStreet()//街道信息
+ aMapLocation.getStreetNum();//门牌号信息
Log.i(TAG, "设备定位成功,设备所在位置:" + device_addr);
} else {
Log.e(TAG, "设备定位失败-》》》》》》错信息-》》》》" + aMapLocation.getErrorCode() + ", 错误信息:" + aMapLocation.getErrorInfo());
}
}
}
@Override
public void onDestroy() {
locationConfigure(false);
super.onDestroy();
}
在使用高德SDK的过成功,出现一些异常SDK都会通过日志告诉我们,在遇到异常的时候只需要根据错误代码前往高德开放平台高德开放平台 | 高德地图API找到对应的问题,进行具体问题具体解决即可。