LocationUtils.java
10.3 KB
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
package com.wd.location;
import android.content.Context;
import android.text.TextUtils;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.apis.utils.core.api.AMapUtilCoreApi;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkitcore.tools.AppContext;
/**
* 定位
* @author lvjinhui
*/
public class LocationUtils {
private AMapLocationClient locationClient = null;
private AMapLocationClientOption locationOption = null;
public LocationUtils() {
initLocation(AppContext.getContext().getApplicationContext());
}
private void initLocation(Context context) {
/**
* 基础库设置是否允许采集个人及设备信息
* @param collectEnable: true 允许采集 false 不允许采集
*/
AMapUtilCoreApi.setCollectInfoEnable(false);
//初始化client
try {
AMapLocationClient.updatePrivacyShow(context,true,true);
AMapLocationClient.updatePrivacyAgree(context,true);
locationClient = new AMapLocationClient(context);
locationOption = getDefaultOption();
if (null != locationClient) {
//设置定位参数
locationClient.setLocationOption(locationOption);
// 设置定位监听
locationClient.setLocationListener(locationListener);
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 默认的定位参数
*
* @author hongming.wang
* @since 2.8.0
*/
private AMapLocationClientOption getDefaultOption() {
AMapLocationClientOption mOption = new AMapLocationClientOption();
//低功耗模式
mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,
// 会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false
// 会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);
//可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)
return mOption;
}
/**
* 定位监听
*/
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (null != location) {
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if (location.getErrorCode() == 0) {
if (locationSuccessListener != null){
locationSuccessListener.onLocationSuccess(location);
}
//定位成功首次请求
int firstLocation = SpUtils.getFirstLocation();
if (2 != firstLocation ){
SpUtils.saveFirstLocation(1);
}
if(!TextUtils.isEmpty(location.getProvince())){
//省发生变化,传递1
String localProvinceName = SpUtils.getUserLocalProviceName();
if (!location.getProvince().equals(localProvinceName)){
SpUtils.saveFirstLocation(1);
}
SpUtils.saveUserLocalProviceName(location.getProvince());
}
if (!TextUtils.isEmpty(location.getCity())){
//保存城市
//SpUtils.saveQtCity(location.getProvince() +"·"+ location.getCity()+"·"+ location.getDistrict());
SpUtils.saveCity(location.getCity() );
}
if(!TextUtils.isEmpty(location.getAdCode())){
//保存区、县code
SpUtils.saveDistrictCode(location.getAdCode());
}
//保存经度、纬度、地址
SpUtils.saveLongitude(location.getLongitude()+"");
SpUtils.saveLatitude(location.getLatitude()+"");
SpUtils.saveAddress(location.getAddress());
if(BuildConfig.DEBUG) {
StringBuffer sb = new StringBuffer();
sb.append("定位成功" + "\n");
sb.append("经 度 : " + location.getLongitude() + "\n");
sb.append("纬 度 : " + location.getLatitude() + "\n");
sb.append("地 址 : " + location.getAddress() + "\n");
sb.append("****************").append("\n");
Logger.t(LocationUtils.class.getSimpleName()).d("---------->"+sb.toString());
}
} else {
if (locationSuccessListener != null){
locationSuccessListener.onLocationFail(location);
}
if(BuildConfig.DEBUG) {
StringBuffer sb = new StringBuffer();
//定位失败
sb.append("定位失败" + "\n");
sb.append("错误码:" + location.getErrorCode() + "\n");
sb.append("错误信息:" + location.getErrorInfo() + "\n");
sb.append("错误描述:" + location.getLocationDetail() + "\n");
sb.append("****************").append("\n");
Logger.t(LocationUtils.class.getSimpleName()).d("---------->"+sb.toString());
}
}
//停止定位,正常定位一次,需要重新定位的调用relocation
stopLocation();
} else {
if (locationSuccessListener != null){
locationSuccessListener.onLocationFail(location);
}
//tv_location.setText("定位失败,loc is null");
stopLocation();
}
}
};
// 根据控件的选择,重新设置定位参数
private void resetOption() {
// 设置是否需要显示地址信息
locationOption.setNeedAddress(true);
/**
* 设置是否优先返回GPS定位结果,如果30秒内GPS没有返回定位结果则进行网络定位
* 注意:只有在高精度模式下的单次定位有效,其他方式无效
*/
locationOption.setGpsFirst(false);//需要快速定位,不要等GPS
// 设置是否开启缓存
locationOption.setLocationCacheEnable(false);
// 设置是否单次定位
locationOption.setOnceLocation(true);
//设置是否等待设备wifi刷新,如果设置为true,会自动变为单次定位,持续定位时不要使用
locationOption.setOnceLocationLatest(true);
//设置是否使用传感器
locationOption.setSensorEnable(false);
locationOption.setInterval(Long.valueOf(3000));
locationOption.setHttpTimeOut(10000);
}
/**
* 开始定位
*
*/
public void startLocation() {
//根据控件的选择,重新设置定位参数
resetOption();
if (null != locationClient) {
// 设置定位参数
locationClient.setLocationOption(locationOption);
// 启动定位
locationClient.startLocation();
}
}
/**
* 停止定位
*
*/
private void stopLocation() {
if (null != locationClient) {
// 停止定位
locationClient.stopLocation();
}
}
/**
* 销毁定位
*
* @author hongming.wang
* @since 2.8.0
*/
public void destroyLocation() {
if (null != locationClient) {
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
locationClient.onDestroy();
locationClient = null;
}
if (null != locationClient) {
locationListener = null;
}
if (null != locationOption) {
locationOption = null;
}
if (locationSuccessListener != null){
locationSuccessListener = null;
}
}
/**
* 设置接口,获取定位
*/
private OnLocationSuccessListener locationSuccessListener;
public interface OnLocationSuccessListener {
/**
* 定位成功
* @param aMapLocation
*/
void onLocationSuccess(AMapLocation aMapLocation);
/**
* 定位失败
*/
default void onLocationFail(AMapLocation aMapLocation){};
}
public void setOnLocationSuccessListener(OnLocationSuccessListener locationSuccessListener){
this.locationSuccessListener = locationSuccessListener;
}
}