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");
}}
}