BdLocationHelper.java 9.1 KB

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