import android.util.Log; import android.widget.Toast; import com.baidu.lbsapi.BMapManager; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; import com.smsc.os.R; import com.smsc.os.frameset.ApplicationExt; import com.smsc.os.utils.WifiNetUtils; /** * description 百度定位地理位置信息工具类 * * @author 喧嚣求静 * @version V1.0 createTime:2014年6月4日 下午4:21:22 */ public class BdMapLocationUtils { private static BdMapLocationUtils single = null; private GeoCoder mMKSearch = null; // 定位客户端 private LocationClient mLocationClient = null; // 百度定位结果回调 private BDLocationListener myListener = new MyLocationListener(); // 定位成功返回信息的回调 private BdLocationSuccessListenner listenner = null; public static interface BdLocationSuccessListenner { public void locationResult(double _latitude, double _longitude, String _locationAddr,String _locationType); } private BdMapLocationUtils() { if (mLocationClient == null) initClient(); } // 静态工厂方法 public synchronized static BdMapLocationUtils getInstance() { if (single == null) { single = new BdMapLocationUtils(); } return single; } private void initClient() { // 声明LocationClient类 mLocationClient = new LocationClient(ApplicationExt.getApplication()); initLoctaionOpt(); } // 初始化定位参数 private void initLoctaionOpt() { LocationClientOption option = new LocationClientOption(); // 设置定位模式 option.setLocationMode(LocationMode.Hight_Accuracy); option.setOpenGps(true);//打开gps // 返回的定位结果是百度经纬度,默认值gcj02 option.setCoorType("bd09ll"); // 设置发起定位请求的间隔时间为5000ms option.setScanSpan(5000); // option.setScanType(5000); // 返回的定位结果包含地址信息 option.setIsNeedAddress(true); // 返回的定位结果包含手机机头的方向 option.setNeedDeviceDirect(true); mLocationClient.setLocOption(option); // 注册监听函数 mLocationClient.registerLocationListener(myListener); } /** * 启动百度定位 * * @param * */ public void startLocation(BdLocationSuccessListenner listenner) { // 首先检测下网络是否连接 if (!WifiNetUtils.isNetworkConnected(ApplicationExt.getApplication())) { Toast.makeText(ApplicationExt.getApplication(), R.string.nowifi, Toast.LENGTH_SHORT).show(); return; } this.listenner = listenner; if (mLocationClient == null) initClient(); if (!mLocationClient.isStarted()) mLocationClient.start(); if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.requestLocation(); }/* else { Toast.makeText(ApplicationExt.getApplication(), "locClient is null or not started", Toast.LENGTH_SHORT) .show(); return; }*/ } public void stopLocation() { if (mLocationClient != null) mLocationClient.stop(); // MKSearch 对象在不使用时需执行销毁函数. if (mMKSearch != null) mMKSearch.destroy(); } private class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return; /* * 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) { /* * sb.append("\nspeed : "); sb.append(location.getSpeed()); * sb.append("\nsatellite : "); * sb.append(location.getSatelliteNumber()); */ if (mMKSearch == null) mMKSearch = GeoCoder.newInstance(); // 注意,MKSearchListener只支持一个,以最后一次设置为准 mMKSearch.setOnGetGeoCodeResultListener(new MySearchListener()); // 逆地址解析 LatLng ptCenter = new LatLng(location.getLatitude(),location.getLongitude()); // 反Geo搜索 mMKSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(ptCenter)); // mMKSearch.geocode(key, city);//地址解析 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { /* * sb.append("\naddr : "); sb.append(location.getAddrStr()); */ if (listenner != null) listenner.locationResult(location.getLatitude(), location.getLongitude(), location.getAddrStr(),"TypeNetWorkLocation"); stopLocation(); } // logMsg(sb.toString()); } public void onReceivePoi(BDLocation poiLocation) { // 将在下个版本中去除poi功能 if (poiLocation == null) { return; } StringBuffer sb = new StringBuffer(256); sb.append("Poi time : "); sb.append(poiLocation.getTime()); sb.append("\nerror code : "); sb.append(poiLocation.getLocType()); sb.append("\nlatitude : "); sb.append(poiLocation.getLatitude()); sb.append("\nlontitude : "); sb.append(poiLocation.getLongitude()); sb.append("\nradius : "); sb.append(poiLocation.getRadius()); if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\naddr : "); sb.append(poiLocation.getAddrStr()); } // logMsg(sb.toString()); } } private class MySearchListener implements OnGetGeoCoderResultListener { @Override public void onGetGeoCodeResult(GeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(ApplicationExt.getApplication(), "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); } } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(ApplicationExt.getApplication(), "抱歉,未能找到结果", Toast.LENGTH_LONG).show(); } if (listenner != null) listenner.locationResult(result.getLocation().latitude, result.getLocation().longitude, result.getAddress(),"TypeGPSLocation"); }} }
android百度地图定位 工具类
猜你喜欢
转载自913.iteye.com/blog/2235778
今日推荐
周排行