android百度地图定位 工具类

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

 

View.OnClickListener onClickListener=new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.baidu_btn: if (MDMUtil.appIsInstalled( getContext(),"com.baidu.BaiduMap")) {//传入指定应用包名 try { double[] gd_lat_lon ; if(RoutingXModel.isGpslatlon){ gd_lat_lon= gaoDeToBaidu(xModel.poc_lon,xModel.poc_lat); }else{ gd_lat_lon= new double[2]; gd_lat_lon[0]=xModel.poc_lon; gd_lat_lon[1]=xModel.poc_lat; } Intent intent = Intent.getIntent("intent://map/direction?" + "destination=latlng:" + gd_lat_lon[1] + "," + gd_lat_lon[0]+ "|name:我的目的地" + //终点 "&mode=driving&" + //导航路线方式 "&src=appname#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(intent); //启动调用 } catch (URISyntaxException e) { Log.e("intent", e.getMessage()); } } else {//未安装 //market为路径,id为包名 //显示手机上所有的market商店 Toast.makeText(getContext(), "您尚未安装百度地图", Toast.LENGTH_LONG).show(); Uri uri = Uri.parse("market://details?id=com.baidu.BaiduMap"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); if (intent.resolveActivity(getContext().getPackageManager()) != null){ getContext().startActivity(intent); } } dismiss(); break; case R.id.gaode_btn: if (MDMUtil.appIsInstalled( getContext(),"com.autonavi.minimap")) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); double[] gd_lat_lon ; if(!RoutingXModel.isGpslatlon){ gd_lat_lon= bdToGaoDe(xModel.poc_lat,xModel.poc_lon); }else{ gd_lat_lon= new double[2]; gd_lat_lon[0]=xModel.poc_lon; gd_lat_lon[1]=xModel.poc_lat; } //将功能Scheme以URI的方式传入data Uri uri = Uri.parse("androidamap://navi?sourceApplication=appname&poiname=fangheng⪫=" + gd_lat_lon[1] + "&lon;=" + gd_lat_lon[0] + "&dev=0&style=4"); intent.setData(uri); //启动该页面即可 getContext().startActivity(intent); } else { Toast.makeText(getContext(), "您尚未安装高德地图", Toast.LENGTH_LONG).show(); Uri uri = Uri.parse("market://details?id=com.autonavi.minimap"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); if (intent.resolveActivity(getContext().getPackageManager()) != null){ getContext().startActivity(intent); } } dismiss(); break; case R.id.tencent_btn: Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); double[] gd_lat_lon ; if(!RoutingXModel.isGpslatlon){ gd_lat_lon= bdToGaoDe(xModel.poc_lat,xModel.poc_lon); }else{ gd_lat_lon= new double[2]; gd_lat_lon[0]=xModel.poc_lon; gd_lat_lon[1]=xModel.poc_lat; } //将功能Scheme以URI的方式传入data Uri uri = Uri.parse("qqmap://map/routeplan?type=drive&to;=我的目的地&tocoord;=" + gd_lat_lon[1]+ "," + gd_lat_lon[0]); intent.setData(uri); if (intent.resolveActivity(getContext().getPackageManager()) != null) { //启动该页面即可 getContext().startActivity(intent); } else { Toast.makeText(getContext(), "您尚未安装腾讯地图", Toast.LENGTH_LONG).show(); } dismiss(); break; case R.id.cancel_btn2: dismiss(); break; } } };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值