BdLocationHelper.java 8.5 KB

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