BdLocationHelper.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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.LocationClientOption.LocationMode;
  10. import com.xzjmyk.pm.activity.sp.LocationSp;
  11. public class BdLocationHelper {
  12. public static final String ACTION_LOCATION_UPDATE = AppConfig.sPackageName + ".action.location_update";
  13. private Context mContext;
  14. private double mLongitude;
  15. private double mLatitude;
  16. private String mAddress;
  17. private String mProvinceName;// 省份
  18. private String mCityName;// 城市
  19. private String mDistrictName;// 街道
  20. private boolean isLocationUpdate;// 本次程序启动后,位置有没有成功更新一次
  21. private LocationClient mLocationClient = null;
  22. private int mFaildCount = 0;
  23. BdLocationHelper(Context context) {
  24. mContext = context;
  25. // 获取上一次的定位数据
  26. mLongitude = LocationSp.getInstance(context).getLongitude(0);
  27. mLatitude = LocationSp.getInstance(context).getLatitude(0);
  28. mAddress = LocationSp.getInstance(context).getAddress("");
  29. mProvinceName = LocationSp.getInstance(context).getProvinceName("");
  30. mCityName = LocationSp.getInstance(context).getCityName("");
  31. mDistrictName = LocationSp.getInstance(context).getDistrictName("");
  32. mLocationClient = new LocationClient(context); // 声明LocationClient类
  33. mLocationClient.registerLocationListener(mMyLocationListener); // 注册监听函数
  34. LocationClientOption option = new LocationClientOption();
  35. option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
  36. option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
  37. option.setScanSpan(5000);// 设置发起定位请求的间隔时间为10s
  38. option.setIsNeedAddress(true);
  39. option.setNeedDeviceDirect(false);
  40. mLocationClient.setLocOption(option);
  41. requestLocation();
  42. }
  43. public void release() {
  44. if (mLocationClient.isStarted()) {
  45. mLocationClient.stop();
  46. }
  47. }
  48. public void requestLocation() {
  49. if (!mLocationClient.isStarted()) {
  50. mFaildCount = 0;
  51. mLocationClient.start();
  52. } else {
  53. int scanSpan = mLocationClient.getLocOption().getScanSpan();
  54. if (scanSpan < 1000) {
  55. mLocationClient.getLocOption().setScanSpan(5000);
  56. }
  57. }
  58. }
  59. private BDLocationListener mMyLocationListener = new BDLocationListener() {
  60. @Override
  61. public void onReceiveLocation(BDLocation location) {
  62. int resultCode = 0;
  63. if (location != null) {
  64. resultCode = location.getLocType();
  65. }
  66. // 百度定位失败
  67. if (resultCode != BDLocation.TypeGpsLocation && resultCode != BDLocation.TypeCacheLocation
  68. && resultCode != BDLocation.TypeOffLineLocation && resultCode != BDLocation.TypeNetWorkLocation) {
  69. if (AppConfig.DEBUG) {
  70. Log.d(AppConfig.TAG, "百度定位失败");
  71. }
  72. mFaildCount++;
  73. if (mFaildCount > 3) {// 停止定位
  74. mLocationClient.stop();
  75. }
  76. return;
  77. }
  78. // 百度定位成功
  79. mLongitude = location.getLongitude();
  80. mLatitude = location.getLatitude();
  81. if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
  82. mAddress = location.getAddrStr();
  83. mProvinceName = location.getProvince();
  84. mCityName = location.getCity();
  85. mDistrictName = location.getDistrict();
  86. if (AppConfig.DEBUG) {
  87. Log.d(AppConfig.TAG,
  88. "百度定位信息 City:" + location.getCity() + " CityCode:" + location.getCityCode() + " 区:" + location.getDistrict());
  89. }
  90. }
  91. if (!isLocationUpdate) {
  92. LocationSp.getInstance(mContext).setLongitude((float) mLongitude);
  93. LocationSp.getInstance(mContext).setLatitude((float) mLatitude);
  94. LocationSp.getInstance(mContext).setAddress(mAddress);
  95. LocationSp.getInstance(mContext).setProvinceName(mProvinceName);
  96. LocationSp.getInstance(mContext).setCityName(mCityName);
  97. LocationSp.getInstance(mContext).setDistrictName(mDistrictName);
  98. isLocationUpdate = true;
  99. }
  100. if (AppConfig.DEBUG) {
  101. Log.d(AppConfig.TAG, "百度定位信息 mLongitude:" + mLongitude + " mLatitude:" + mLatitude + " mAddressDetail:" + mAddress);
  102. }
  103. mLocationClient.stop();
  104. // if (isTimingScan()) {// 停止定时定位
  105. // mLocationClient.getLocOption().setScanSpan(100);
  106. // }
  107. mContext.sendBroadcast(new Intent(ACTION_LOCATION_UPDATE));// 发送广播
  108. }
  109. };
  110. // 获取经纬度
  111. public double getLongitude() {
  112. return mLongitude;
  113. }
  114. // 获取经纬度
  115. public double getLatitude() {
  116. return mLatitude;
  117. }
  118. // 获取地址详情
  119. public String getAddress() {
  120. return mAddress;
  121. }
  122. public String getProvinceName() {
  123. return mProvinceName;
  124. }
  125. public String getCityName() {
  126. return mCityName;
  127. }
  128. public String getDistrictName() {
  129. return mDistrictName;
  130. }
  131. public boolean isLocationUpdate() {
  132. return isLocationUpdate;
  133. }
  134. public boolean hasData() {
  135. return mLatitude != 0 && mLongitude != 0;
  136. }
  137. }