BdLocationHelper.java 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package com.xzjmyk.pm.activity;
  2. import android.content.Context;
  3. import android.util.Log;
  4. import com.baidu.location.BDLocation;
  5. import com.baidu.location.BDLocationListener;
  6. import com.baidu.location.LocationClient;
  7. import com.baidu.location.LocationClientOption;
  8. import com.baidu.location.Poi;
  9. import com.xzjmyk.pm.activity.sp.LocationSp;
  10. import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
  11. import java.util.List;
  12. public class BdLocationHelper {
  13. public static final String ACTION_LOCATION_UPDATE = AppConfig.sPackageName + ".action.location_update";
  14. private Context mContext;
  15. private double mLongitude;
  16. private double mLatitude;
  17. private String mAddress;
  18. private String name;
  19. private String mProvinceName;// 省份
  20. private String mCityName;// 城市
  21. private String mDistrictName;// 街道
  22. private boolean isLocationUpdate;// 本次程序启动后,位置有没有成功更新一次
  23. private LocationClient mLocationClient = null;
  24. private int mFaildCount = 0;
  25. private int resultCode;
  26. private List<Poi> pois;
  27. private int scanSpan = 20 * 1000;
  28. private long oldTime = 0;
  29. BdLocationHelper(Context context) {
  30. mContext = context;
  31. // 获取上一次的定位数据
  32. // mLongitude = LocationSp.getInstance(context).getLongitude(0);
  33. // mLatitude = LocationSp.getInstance(context).getLatitude(0);
  34. // mAddress = LocationSp.getInstance(context).getAddress("");
  35. // mProvinceName = LocationSp.getInstance(context).getProvinceName("");
  36. // mCityName = LocationSp.getInstance(context).getCityName("");
  37. // mDistrictName = LocationSp.getInstance(context).getDistrictName("");
  38. //关闭缓存
  39. mLongitude = 0;
  40. mLatitude = 0;
  41. mAddress = "";
  42. mProvinceName = "";
  43. mCityName = "";
  44. mDistrictName = "";
  45. mLocationClient = new LocationClient(context.getApplicationContext()); // 声明LocationClient类
  46. mLocationClient.registerLocationListener(mMyLocationListener); // 注册监听函数
  47. LocationClientOption option = new LocationClientOption();
  48. option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
  49. option.setCoorType("bd09ll");//可选,默认gcj02 bd09ll,设置返回的定位结果坐标系
  50. option.setScanSpan(scanSpan);// 设置发起定位请求的间隔时间为10s;//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
  51. option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
  52. option.setOpenGps(true);//可选,默认false,设置是否使用gps
  53. option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
  54. option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
  55. option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
  56. option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
  57. option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
  58. option.setEnableSimulateGps(true);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
  59. option.setNeedDeviceDirect(false);
  60. // option.disableCache(true);//是否禁用缓存数据
  61. mLocationClient.setLocOption(option);
  62. //requestLocation();//重新定位
  63. }
  64. public void release() {
  65. if (mLocationClient.isStarted()) {
  66. mLocationClient.stop();
  67. }
  68. }
  69. private static final String TAG = "BdLocationHelper";
  70. public void requestLocation() {
  71. if (mLocationClient != null && !mLocationClient.isStarted()) {
  72. mFaildCount = 0;
  73. mLocationClient.start();
  74. Log.i(TAG, "requestLocation:start()");
  75. } else {
  76. int scanSpan = mLocationClient.getLocOption().getScanSpan();
  77. if (scanSpan < 1000) {
  78. mLocationClient.getLocOption().setScanSpan(5000);
  79. }
  80. Log.i(TAG, "requestLocation:request()");
  81. }
  82. }
  83. private BDLocationListener mMyLocationListener = new BDLocationListener() {
  84. @Override
  85. public void onReceiveLocation(BDLocation location) {
  86. int resultCode = 0;
  87. if (location != null) {
  88. resultCode = location.getLocType();
  89. }
  90. BdLocationHelper.this.resultCode = resultCode;
  91. // 百度定位失败
  92. if (resultCode != BDLocation.TypeGpsLocation && resultCode != BDLocation.TypeCacheLocation
  93. && resultCode != BDLocation.TypeOffLineLocation && resultCode != BDLocation.TypeNetWorkLocation) {
  94. if (AppConfig.DEBUG) {
  95. Log.d(AppConfig.TAG, "百度定位失败");
  96. }
  97. mFaildCount++;
  98. if (mFaildCount > 3) {// 停止定位
  99. mLocationClient.stop();
  100. }
  101. if (listener != null) {
  102. listener.result(false);
  103. }
  104. return;
  105. }
  106. // 百度定位成功
  107. mLongitude = location.getLongitude();
  108. mLatitude = location.getLatitude();
  109. name = location.getLocationDescribe();
  110. pois = location.getPoiList();
  111. if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
  112. mAddress = location.getAddrStr();
  113. mProvinceName = location.getProvince();
  114. mCityName = location.getCity();
  115. mDistrictName = location.getDistrict();
  116. if (AppConfig.DEBUG) {
  117. Log.d(AppConfig.TAG,
  118. "百度定位信息 City:" + location.getCity() + " CityCode:" + location.getCityCode() + " 区:" + location.getDistrict());
  119. }
  120. }
  121. if (!isLocationUpdate) {
  122. LocationSp.getInstance(mContext).setLongitude((float) mLongitude);
  123. LocationSp.getInstance(mContext).setLatitude((float) mLatitude);
  124. LocationSp.getInstance(mContext).setAddress(mAddress);
  125. LocationSp.getInstance(mContext).setProvinceName(mProvinceName);
  126. LocationSp.getInstance(mContext).setCityName(mCityName);
  127. LocationSp.getInstance(mContext).setDistrictName(mDistrictName);
  128. isLocationUpdate = true;
  129. }
  130. if (AppConfig.DEBUG) {
  131. Log.d(AppConfig.TAG, "百度定位信息 mLongitude:" + mLongitude + " mLatitude:" + mLatitude + " mAddressDetail:" + mAddress);
  132. Log.d(AppConfig.TAG, "resultCode:" + resultCode);
  133. }
  134. // release();
  135. // if (isTimingScan()) {// 停止定时定位
  136. // mLocationClient.getLocOption().setScanSpan(100);
  137. // }
  138. // mContext.sendBroadcast(new Intent(ACTION_LOCATION_UPDATE));// 发送广播
  139. if (listener != null) {
  140. listener.result(true);
  141. }
  142. }
  143. };
  144. private static final long INTERVAL_TIME = 60000;//间隔时间
  145. private int type = 1;//1.内勤 2.外勤
  146. public String getName() {
  147. return pois == null ? (StringUtils.isEmail(name)? "当前位置" : name) : (pois.get(0) == null ? (name == null ? "当前位置" : name) : pois.get(0).getName());
  148. }
  149. public void setName(String name) {
  150. this.name = name;
  151. }
  152. // 获取经纬度
  153. public double getLongitude() {
  154. return mLongitude;
  155. }
  156. // 获取经纬度
  157. public double getLatitude() {
  158. return mLatitude;
  159. }
  160. // 获取地址详情
  161. public String getAddress() {
  162. return mAddress;
  163. }
  164. public String getProvinceName() {
  165. return mProvinceName;
  166. }
  167. public String getCityName() {
  168. return mCityName;
  169. }
  170. public String getDistrictName() {
  171. return mDistrictName;
  172. }
  173. public boolean isLocationUpdate() {
  174. return isLocationUpdate;
  175. }
  176. public boolean hasData() {
  177. return mLatitude != 0 && mLongitude != 0;
  178. }
  179. private OnBaiduResultListener listener = null;
  180. public OnBaiduResultListener getListener() {
  181. return listener;
  182. }
  183. public void setListener(OnBaiduResultListener listener) {
  184. this.listener = listener;
  185. }
  186. public interface OnBaiduResultListener {
  187. void result(boolean isOk);
  188. }
  189. public int getResultCode() {
  190. return resultCode;
  191. }
  192. }