| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- package com.xzjmyk.pm.activity;
- 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 com.xzjmyk.pm.activity.sp.LocationSp;
- import com.xzjmyk.pm.activity.ui.erp.util.StringUtils;
- import java.util.List;
- public class BdLocationHelper {
- public static final String ACTION_LOCATION_UPDATE = AppConfig.sPackageName + ".action.location_update";
- private Context mContext;
- private double mLongitude;
- private double mLatitude;
- private String mAddress;
- private String name;
- private String mProvinceName;// 省份
- private String mCityName;// 城市
- private String mDistrictName;// 街道
- private boolean isLocationUpdate;// 本次程序启动后,位置有没有成功更新一次
- private LocationClient mLocationClient = null;
- private int mFaildCount = 0;
- private int resultCode;
- private List<Poi> pois;
- private int scanSpan = 20 * 1000;
- private long oldTime = 0;
- BdLocationHelper(Context context) {
- mContext = context;
- // 获取上一次的定位数据
- // mLongitude = LocationSp.getInstance(context).getLongitude(0);
- // mLatitude = LocationSp.getInstance(context).getLatitude(0);
- // mAddress = LocationSp.getInstance(context).getAddress("");
- // mProvinceName = LocationSp.getInstance(context).getProvinceName("");
- // mCityName = LocationSp.getInstance(context).getCityName("");
- // mDistrictName = LocationSp.getInstance(context).getDistrictName("");
- //关闭缓存
- mLongitude = 0;
- mLatitude = 0;
- mAddress = "";
- mProvinceName = "";
- mCityName = "";
- mDistrictName = "";
- mLocationClient = new LocationClient(context.getApplicationContext()); // 声明LocationClient类
- mLocationClient.registerLocationListener(mMyLocationListener); // 注册监听函数
- LocationClientOption option = new LocationClientOption();
- option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
- option.setCoorType("bd09ll");//可选,默认gcj02 bd09ll,设置返回的定位结果坐标系
- option.setScanSpan(scanSpan);// 设置发起定位请求的间隔时间为10s;//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
- option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
- option.setOpenGps(true);//可选,默认false,设置是否使用gps
- option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
- option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
- option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
- option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
- option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
- option.setEnableSimulateGps(true);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
- option.setNeedDeviceDirect(false);
- // option.disableCache(true);//是否禁用缓存数据
- mLocationClient.setLocOption(option);
- //requestLocation();//重新定位
- }
- public void release() {
- if (mLocationClient.isStarted()) {
- mLocationClient.stop();
- }
- }
- private static final String TAG = "BdLocationHelper";
- public void requestLocation() {
- if (mLocationClient != null && !mLocationClient.isStarted()) {
- mFaildCount = 0;
- mLocationClient.start();
- Log.i(TAG, "requestLocation:start()");
- } else {
- int scanSpan = mLocationClient.getLocOption().getScanSpan();
- if (scanSpan < 1000) {
- mLocationClient.getLocOption().setScanSpan(5000);
- }
- Log.i(TAG, "requestLocation:request()");
- }
- }
- private BDLocationListener mMyLocationListener = new BDLocationListener() {
- @Override
- public void onReceiveLocation(BDLocation location) {
- int resultCode = 0;
- if (location != null) {
- resultCode = location.getLocType();
- }
- BdLocationHelper.this.resultCode = resultCode;
- // 百度定位失败
- if (resultCode != BDLocation.TypeGpsLocation && resultCode != BDLocation.TypeCacheLocation
- && resultCode != BDLocation.TypeOffLineLocation && resultCode != BDLocation.TypeNetWorkLocation) {
- if (AppConfig.DEBUG) {
- Log.d(AppConfig.TAG, "百度定位失败");
- }
- mFaildCount++;
- if (mFaildCount > 3) {// 停止定位
- mLocationClient.stop();
- }
- if (listener != null) {
- listener.result(false);
- }
- return;
- }
- // 百度定位成功
- mLongitude = location.getLongitude();
- mLatitude = location.getLatitude();
- name = location.getLocationDescribe();
- pois = location.getPoiList();
- if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
- mAddress = location.getAddrStr();
- mProvinceName = location.getProvince();
- mCityName = location.getCity();
- mDistrictName = location.getDistrict();
- if (AppConfig.DEBUG) {
- Log.d(AppConfig.TAG,
- "百度定位信息 City:" + location.getCity() + " CityCode:" + location.getCityCode() + " 区:" + location.getDistrict());
- }
- }
- if (!isLocationUpdate) {
- LocationSp.getInstance(mContext).setLongitude((float) mLongitude);
- LocationSp.getInstance(mContext).setLatitude((float) mLatitude);
- LocationSp.getInstance(mContext).setAddress(mAddress);
- LocationSp.getInstance(mContext).setProvinceName(mProvinceName);
- LocationSp.getInstance(mContext).setCityName(mCityName);
- LocationSp.getInstance(mContext).setDistrictName(mDistrictName);
- isLocationUpdate = true;
- }
- if (AppConfig.DEBUG) {
- Log.d(AppConfig.TAG, "百度定位信息 mLongitude:" + mLongitude + " mLatitude:" + mLatitude + " mAddressDetail:" + mAddress);
- Log.d(AppConfig.TAG, "resultCode:" + resultCode);
- }
- // release();
- // if (isTimingScan()) {// 停止定时定位
- // mLocationClient.getLocOption().setScanSpan(100);
- // }
- // mContext.sendBroadcast(new Intent(ACTION_LOCATION_UPDATE));// 发送广播
- if (listener != null) {
- listener.result(true);
- }
- }
- };
- private static final long INTERVAL_TIME = 60000;//间隔时间
- private int type = 1;//1.内勤 2.外勤
- public String getName() {
- return pois == null ? (StringUtils.isEmail(name)? "当前位置" : name) : (pois.get(0) == null ? (name == null ? "当前位置" : name) : pois.get(0).getName());
- }
- public void setName(String name) {
- this.name = name;
- }
- // 获取经纬度
- public double getLongitude() {
- return mLongitude;
- }
- // 获取经纬度
- public double getLatitude() {
- return mLatitude;
- }
- // 获取地址详情
- public String getAddress() {
- return mAddress;
- }
- public String getProvinceName() {
- return mProvinceName;
- }
- public String getCityName() {
- return mCityName;
- }
- public String getDistrictName() {
- return mDistrictName;
- }
- public boolean isLocationUpdate() {
- return isLocationUpdate;
- }
- public boolean hasData() {
- return mLatitude != 0 && mLongitude != 0;
- }
- private OnBaiduResultListener listener = null;
- public OnBaiduResultListener getListener() {
- return listener;
- }
- public void setListener(OnBaiduResultListener listener) {
- this.listener = listener;
- }
- public interface OnBaiduResultListener {
- void result(boolean isOk);
- }
- public int getResultCode() {
- return resultCode;
- }
- }
|