`
喧嚣求静
  • 浏览: 574395 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    Android-BDLocationUtil百度地图定位工具类

    总的来说,"Android-BDLocationUtil"是一个实用的工具,它降低了Android开发者集成百度地图定位服务的门槛,提高了开发效率,同时也优化了应用的定位体验。通过深入理解和合理运用这个工具类,开发者可以更专注于...

    老罗android 百度地图开发源码

    在Android开发中,百度地图API是一个非常常用的工具,它提供了丰富的地图展示、定位、路径规划等功能,极大地便利了开发者在构建地理位置相关应用时的工作。"老罗android 百度地图开发源码"是一个示例项目,它展示了...

    Android开发之百度地图定位打卡

    总的来说,实现“Android开发之百度地图定位打卡”涉及到Android应用开发基础、百度地图API的集成与使用、位置服务的管理和定制化功能的实现等多个方面,需要开发者具备扎实的Android编程技能和良好的问题解决能力。...

    Android 监听百度地图缩放事件

    百度地图作为一款功能强大的地图服务工具,在Android开发中被广泛应用。对于地图的交互操作(如缩放),开发者往往希望能够在地图状态改变时获取到相应的事件,以便执行特定的操作。本文将详细介绍如何在Android应用...

    Android百度地图Marker轨迹坐标连线

    在"Android百度地图Marker轨迹坐标连线"这个项目中,我们主要关注如何在地图上显示多个Marker并用线段连接它们,形成一条轨迹。这个功能在路径规划、导航或者运动轨迹记录等场景中非常实用。 首先,我们需要集成...

    Android-Android定位基于百度基础定位sdk封装

    本项目“Android-Android定位基于百度基础定位sdk封装”提供了一个方便开发者使用的Android定位解决方案,它基于百度地图SDK进行封装,简化了集成过程,使得开发者能够更快速地实现定位功能。 首先,我们需要了解...

    百度地图工具类

    百度地图工具类,用它分分钟实现定位功能,简单易懂,方便好用!

    android百度地图定位、路线查询、城市查询、poi查询

    在Android开发中,百度地图API是一个非常实用的工具,它为开发者提供了丰富的地图服务功能,包括定位、路线规划、城市查询以及兴趣点(POI)搜索。以下将详细阐述这些功能及其实现方式。 首先,**定位功能**是百度...

    android 百度定位、离线地图、测量、运动轨迹doem基于百度地图的部分功能

    在Android开发中,百度地图API提供了丰富的功能,包括定位、离线地图、测量以及运动轨迹绘制等。这些功能使得开发者可以构建出具有专业地理信息处理能力的应用。在使用百度地图API时,尤其对于Android 6.0及以上版本...

    unity调Android百度地图

    在Unity游戏引擎中调用Android百度地图SDK是一项常见的跨平台开发任务,这使得开发者能够在Unity游戏中集成地图功能,实现定位、导航、路线规划等服务。本文将深入探讨如何实现这一技术,以及涉及到的相关知识点。 ...

    android 百度地图学习SDK案例

    在Android开发中,百度地图SDK是一个非常重要的工具,它提供了丰富的地图功能,如定位、路线规划、地图渲染等,使得开发者能够轻松地在应用程序中集成地图功能。本篇将深入探讨"android 百度地图学习SDK案例"的相关...

    android 百度地图案例(源码)

    在Android开发中,百度地图API是一个非常实用的工具,它为开发者提供了丰富的地图展示、定位、路线规划等功能。本文将详细解析"android 百度地图案例(源码)",帮助初学者理解如何在Android应用中集成并使用百度...

    android 百度地图演示源码

    在Android开发中,百度地图API是一个非常实用的工具,它为开发者提供了丰富的地图展示、定位、路线规划等功能。本教程将基于"android 百度地图演示源码"这个项目,详细解析其背后的IT知识点。 首先,我们要理解...

    Android百度地图API源码.zip

    本资源“Android百度地图API源码.zip”包含的是百度地图API的源代码,这对于理解其内部工作原理、自定义功能以及优化性能非常有帮助。现在,我们将深入探讨这个API的几个关键知识点。 首先,**地图展示**是百度地图...

    Android,百度地图标注及聚合

    在Android开发中,百度地图API是一个非常重要的工具,它提供了丰富的地图展示、定位、路径规划等功能,使得开发者能够轻松地将地图集成到自己的应用程序中。本篇主要探讨如何在Android应用中实现百度地图的标注及...

    Android百度地图覆盖层

    "Android百度地图覆盖层"这个知识点主要涉及如何在地图上显示自定义的图形元素,如标记、信息窗口、自定义图层等,以增强地图的信息展示和交互性。 首先,我们要理解什么是覆盖层(Overlay)。在百度地图API中,...

    定位路线规划android百度地图源码

    本项目"定位路线规划android百度地图源码"提供了一个完整的解决方案,利用百度地图API来实现实时定位、路径规划以及地图上的轨迹绘制。下面将详细讲解其中涉及的技术点。 1. **百度地图SDK集成**: 百度地图SDK是...

    android读取JSON数据在百度地图上画线

    在Android开发中,将JSON数据解析并显示在百度地图上是一项常见的任务,特别是在构建地理位置相关的应用时。本项目"android读取JSON数据在百度地图上画线"提供了一个实际的示例,展示如何使用Android Studio处理JSON...

    android百度地图源码

    总的来说,通过分析"android百度地图源码",我们可以学习到如何在Android应用中集成百度地图,实现地图显示、定位、路径规划等核心功能。这不仅加深了对Android SDK的理解,也拓展了在地理信息系统方面的开发技能。...

    Android 百度地图 SDK v3.4.0 定位与结合方向传感器

    在Android开发中,百度地图SDK是一个非常重要的工具,它提供了丰富的功能,如定位、地图展示、路线规划等。本文将详细解析"Android 百度地图 SDK v3.4.0"中的定位功能以及如何结合方向传感器来实现更精确的导航体验...

Global site tag (gtag.js) - Google Analytics