content: package com.aishang5wpj.baiduloc;
  
  import android.content.Context;
  import android.util.Log;
  
  import com.baidu.location.BDLocation;
  import com.baidu.location.BDLocationListener;
  import com.baidu.location.LocationClient;
  import com.baidu.location.LocationClientOption;
  import com.baidu.location.Poi;
  
  import java.util.List;
  
  /**
   * Created by wpj on 16/5/24下午2:32.
   *
   * @see http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc
   */
  public class LocationHelper {
  
      public static final String DEFAULT_CITY = "上海";
  
      private Context mContext;
      private LocationClient mLocationClient = null;
      private OnLocationListener mLocationListener;
      private BDLocation mBDLocation;
  
      private LocationHelper() {
  
      }
  
      public static final LocationHelper getHelper() {
          return LazyHolder.INSTANCE;
      }
  
      public void init(Context context) {
          mContext = context;
      }
  
      public void start(OnLocationListener locationListener) {
          mLocationListener = locationListener;
  
          if (mLocationClient == null) {
              prepare();
          }
          if (null != mBDLocation && null != mLocationListener) {
  
              mLocationListener.onLocationSuccessed(mBDLocation.getCity().replace("市", ""),
                      mBDLocation.getLatitude(), mBDLocation.getLongitude());
          } else {
  
              mLocationClient.start();
          }
      }
  
      private void prepare() {
          mLocationClient = new LocationClient(mContext);     //声明LocationClient类
          mLocationClient.registerLocationListener(new MyLocationListener());    //注册监听函数
          LocationClientOption option = new LocationClientOption();
          //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
          option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
          option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
          int span = 1000;
          option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
          option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
          option.setOpenGps(true);//可选，默认false,设置是否使用gps
          option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
          //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation
          // .getLocationDescribe里得到，结果类似于“在北京天安门附近”
          option.setIsNeedLocationDescribe(true);
          option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
          //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
          option.setIgnoreKillProcess(false);
          option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
          option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
          mLocationClient.setLocOption(option);
      }
  
      public interface OnLocationListener {
          void onLocationFailed();
  
          void onLocationSuccessed(String city, double latitude, double lontitude);
      }
  
      private static final class LazyHolder {
          private static final LocationHelper INSTANCE = new LocationHelper();
      }
  
      public class MyLocationListener implements BDLocationListener {
  
          @Override
          public void onReceiveLocation(BDLocation location) {
  
              if (null == location) {
                  if (null != mLocationListener) {
                      mLocationListener.onLocationFailed();
                  }
                  return;
              }
              //定位成功之后，停止定位
              mBDLocation = location;
              mLocationClient.stop();
              if (null != mLocationListener) {
                  mLocationListener.onLocationSuccessed(mBDLocation.getCity().replace("市", ""),
                          location.getLatitude(), location.getLongitude());
              }
  
              //Receive Location
              StringBuffer sb = new StringBuffer(256);
              sb.append("time : ");
              sb.append(location.getTime());
              sb.append("\nerror code : ");
              sb.append(location.getLocType());
              sb.append("\nlatitude : ");
              sb.append(location.getLatitude());
              sb.append("\nlontitude : ");
              sb.append(location.getLongitude());
              sb.append("\nradius : ");
              sb.append(location.getRadius());
              if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
                  sb.append("\nspeed : ");
                  sb.append(location.getSpeed());// 单位：公里每小时
                  sb.append("\nsatellite : ");
                  sb.append(location.getSatelliteNumber());
                  sb.append("\nheight : ");
                  sb.append(location.getAltitude());// 单位：米
                  sb.append("\ndirection : ");
                  sb.append(location.getDirection());// 单位度
                  sb.append("\naddr : ");
                  sb.append(location.getAddrStr());
                  sb.append("\ndescribe : ");
                  sb.append("gps定位成功");
  
              } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
                  sb.append("\naddr : ");
                  sb.append(location.getAddrStr());
                  //运营商信息
                  sb.append("\noperationers : ");
                  sb.append(location.getOperators());
                  sb.append("\ndescribe : ");
                  sb.append("网络定位成功");
              } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                  sb.append("\ndescribe : ");
                  sb.append("离线定位成功，离线定位结果也是有效的");
              } else if (location.getLocType() == BDLocation.TypeServerError) {
                  sb.append("\ndescribe : ");
                  sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
              } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                  sb.append("\ndescribe : ");
                  sb.append("网络不同导致定位失败，请检查网络是否通畅");
              } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                  sb.append("\ndescribe : ");
                  sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
              }
              sb.append("\nlocationdescribe : ");
              sb.append(location.getLocationDescribe());// 位置语义化信息
              List<Poi> list = location.getPoiList();// POI数据
              if (list != null) {
                  sb.append("\npoilist size = : ");
                  sb.append(list.size());
                  for (Poi p : list) {
                      sb.append("\npoi= : ");
                      sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                  }
              }
              Log.i("BaiduLocationApiDem", sb.toString());
          }
      }
  }