`
iaiai
  • 浏览: 2196879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 封装了GPS定位与百度移动地图API定位

 
阅读更多
共三个类:

第一个:MainForm.java
/**
 * <br/>
 * Title: MainForm.java <br/>
 * E-Mail: 176291935@qq.com <br/>
 * QQ: 176291935 <br/>
 * Http: iaiai.iteye.com <br/>
 * Create time: 2012-12-21 上午10:16:10 <br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class MainForm extends Activity {
	private Context mContext = this;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		GpsManager.getInstance().create(mContext);
		BGpsManager.getInstance().create(mContext);
		GpsManager.getInstance().start();
		BGpsManager.getInstance().start();

		int[] id1 = new int[] { R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5 };
		int[] id2 = new int[] { R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9, R.id.btn10 };

		for (int id : id1) {
			Button btn = (Button) findViewById(id);
			btn.setOnClickListener(new btnGps_onClickListener());
		}

		for (int id : id2) {
			Button btn = (Button) findViewById(id);
			btn.setOnClickListener(new btnBGps_onClickListener());
		}
	}

	private class btnGps_onClickListener implements View.OnClickListener {
		public void onClick(View v) {
			Button btn = (Button) v;

			switch (btn.getId()) {
			case R.id.btn1:
				String adds = GpsManager.getInstance().getAddress();

				if (null == adds || adds.length() == 0) {
					Toast.makeText(mContext, "获取失败", Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(mContext, adds, Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.btn2:
				Location lt = GpsManager.getInstance().getCurrentLocation();

				if (null != lt) {
					Toast.makeText(mContext, String.format("维度:%f 经度:%f", lt.getLatitude(), lt.getLongitude()),
							Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(mContext, "获取失败", Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.btn3:
				GpsManager.getInstance().start();
				break;
			case R.id.btn4:
				GpsManager.getInstance().stop();
				break;
			case R.id.btn5:
				GpsManager.getInstance().restart();
				break;
			}
		}
	}

	private class btnBGps_onClickListener implements View.OnClickListener {
		public void onClick(View v) {
			Button btn = (Button) v;

			switch (btn.getId()) {
			case R.id.btn6:
				String adds = BGpsManager.getInstance().getAddress();

				if (null == adds || adds.length() == 0) {
					Toast.makeText(mContext, "获取失败", Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(mContext, adds, Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.btn7:
				Location lt = BGpsManager.getInstance().getCurrentLocation();

				if (null != lt) {
					Toast.makeText(mContext, String.format("纬度:%f 经度:%f", lt.getLatitude(), lt.getLongitude()),
							Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(mContext, "获取失败", Toast.LENGTH_SHORT).show();
				}
				break;
			case R.id.btn8:
				BGpsManager.getInstance().start();
				break;
			case R.id.btn9:
				BGpsManager.getInstance().stop();
				break;
			case R.id.btn10:
				BGpsManager.getInstance().restart();
				break;
			}
		}
	}
}


第二个:GpsManager.java
/**
 * 通过GPS/AGPS定位(AGPS采用谷歌基站免费服务获取位置信息) <br/>
 * Title: GpsManager.java <br/>
 * E-Mail: 176291935@qq.com <br/>
 * QQ: 176291935 <br/>
 * Http: iaiai.iteye.com <br/>
 * Create time: 2012-12-21 上午10:16:10 <br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class GpsManager {
	private static String TAG = "GPS";

	private LocationManager lm; // 位置管理
	private MyLocationListener mll; // 位置监听
	private Location currentLocation; // 当前位置
	private Criteria ctr; // 定位标准
	private String provider; // 最佳提供者
	private boolean isCanceled; // 是否取消
	private Context mContext;
	private Handler handMessage;

	private static GpsManager instance;

	private GpsManager() {
	}

	public static GpsManager getInstance() {
		if (null == instance) {
			instance = new GpsManager();
		}

		return instance;
	}

	private void load() {
		// 获取系统服务
		lm = (LocationManager) mContext.getSystemService(Activity.LOCATION_SERVICE);

		// 创建定位标准
		ctr = new Criteria();
		ctr.setAccuracy(Criteria.ACCURACY_FINE); // 设置精准度,待测试差距
		ctr.setAltitudeRequired(false); // 设置是否返回海拔
		ctr.setBearingRequired(false); // 设置是否返回方向
		ctr.setCostAllowed(false); // 设置是否允许付费服务
		ctr.setPowerRequirement(Criteria.POWER_HIGH); // 设置耗电等级
		ctr.setSpeedRequired(false); // 设置是否返回速度信息

		// 根据设置的定位条件,获取最佳provider对象,获取失败默认为GPS定位
		provider = isNull(lm.getBestProvider(ctr, true), LocationManager.NETWORK_PROVIDER);
		// 创建位置监听器
		mll = new MyLocationListener();
		// 开启GPS状态监听
		new MyGpsStatusListener().start();
		// 创建消息
		handMessage = new HandlerMessage();

		isCanceled = true;
	}

	/** 创建定位 */
	public void create(Context mContext) {
		if (null != this.mContext)
			return;

		this.mContext = mContext;

		load();
	}

	/** 开始定位 */
	public void start() {
		handMessage.sendEmptyMessage(0);
	}

	/** 停止定位 */
	public void stop() {
		handMessage.sendEmptyMessage(1);
	}

	/** 重启定位 */
	public void restart() {
		handMessage.sendEmptyMessage(2);
	}

	/** 获取地址 */
	public String getAddress() {
		if (null == currentLocation)
			return null;

		StringBuffer sbAdds = new StringBuffer();

		try {
			// 创建地理位置编码
			Geocoder gCod = new Geocoder(mContext);

			List<Address> lAdds = gCod
					.getFromLocation(currentLocation.getLatitude(), currentLocation.getLongitude(), 1);

			if (null == lAdds || lAdds.size() == 0 || null == lAdds.get(0))
				return null;

			Address adds = lAdds.get(0);

			sbAdds.append(isNull(adds.getAddressLine(1), ""));
			sbAdds.append(isNull(adds.getAddressLine(2), ""));

			if (sbAdds.length() == 0) {
				sbAdds.append(isNull(adds.getAdminArea(), ""));
				sbAdds.append(isNull(adds.getLocality(), ""));
				sbAdds.append(isNull(adds.getThoroughfare(), ""));
				sbAdds.append(isNull(adds.getFeatureName(), ""));
			}
		} catch (Exception ex) {
			if (null != ex && null != ex.getMessage()) {
				Log.i(TAG, ex.getMessage());
			}
		}

		return sbAdds.toString();
	}

	/** 获取当前位置 */
	public Location getCurrentLocation() {
		return currentLocation;
	}

	/** GPS状态监听 */
	private class MyGpsStatusListener extends Thread {
		public void run() {
			while (true) {
				try {
					Thread.sleep(500);

					String newProvider = isNull(lm.getBestProvider(ctr, true), LocationManager.NETWORK_PROVIDER);
					// Log.i(TAG, String.format("状态:%s", newProvider));

					if (!provider.equals(newProvider)) {
						provider = newProvider;
						restart();
					}

					Thread.sleep(1000);
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}
	}

	private class HandlerMessage extends Handler {
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			switch (msg.what) {
			case 0:
				// 绑定位置监听器
				if (!isCanceled)
					return;

				lm.requestLocationUpdates(provider, 0, 0, mll);
				isCanceled = false;

				Log.i(TAG, "开始定位");
				break;
			case 1:
				// 取消绑定位置监听器
				if (isCanceled)
					return;

				lm.removeUpdates(mll);
				isCanceled = true;

				Log.i(TAG, "停止定位");
				break;
			case 2:
				// 重新绑定位置监听器
				if (!isCanceled) {
					lm.removeUpdates(mll);
				}
				lm.requestLocationUpdates(provider, 0, 0, mll);
				isCanceled = true;

				Log.i(TAG, "重启定位");
				break;
			}
		}
	}

	/** 位置监听器 */
	private class MyLocationListener implements LocationListener {
		// 位置发生变动时触发
		public void onLocationChanged(Location location) {
			currentLocation = location;
			Log.i(TAG, "获取到了位置!");
		}

		// provider终止时调用
		public void onProviderDisabled(String provider) {
		}

		// provider启动时调用
		public void onProviderEnabled(String provider) {
		}

		// provider状态改变时调用
		public void onStatusChanged(String provider, int status, Bundle extras) {
		}
	}

	private String isNull(String str, String defValue) {
		if (null == str || str.length() == 0)
			return defValue;

		return str;
	}
}


第三个:BGpsManager.java
/**
 * 使用百度移动API进行定位 编写时间<br/>
 * Title: BGpsManager.java <br/>
 * E-Mail: 176291935@qq.com <br/>
 * QQ: 176291935 <br/>
 * Http: iaiai.iteye.com <br/>
 * Create time: 2012-12-21 上午10:16:10 <br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class BGpsManager {
	// 百度API授权Key,申请地址:http://dev.baidu.com/wiki/static/imap/key/
	private static final String KEY = "327BC8EEE5ACB2F00811A184AB66BEC124E34EFE";
	private static String TAG = "Baidu_GPS";

	private BMapManager mMapManager;
	private MyLocationListener mll;
	private Location currentLocation; // 当前位置
	private boolean isCanceled; // 是否取消
	private MKSearch mSearch; // 搜素模块
	private Context mContext;
	private Handler handMessage;
	private String address;

	private static BGpsManager instance;

	private BGpsManager() {
	}

	public static BGpsManager getInstance() {
		if (null == instance) {
			instance = new BGpsManager();
		}

		return instance;
	}

	private void load() {
		// 创建地图管理
		mMapManager = new BMapManager(mContext);
		mMapManager.init(KEY, null);
		mMapManager.start();

		// 创建搜索
		mSearch = new MKSearch();
		mSearch.init(mMapManager, new MyMKSearchListener());

		// 创建位置监控器
		mll = new MyLocationListener();

		// 创建消息
		handMessage = new HandlerMessage();

		isCanceled = true;
	}

	/** 创建定位 */
	public void create(Context mContext) {
		if (null != this.mContext)
			return;

		this.mContext = mContext;

		load();
	}

	/** 开始定位 */
	public void start() {
		handMessage.sendEmptyMessage(0);
	}

	/** 停止定位 */
	public void stop() {
		handMessage.sendEmptyMessage(1);
	}

	/** 重启定位 */
	public void restart() {
		handMessage.sendEmptyMessage(2);
	}

	private class HandlerMessage extends Handler {
		public void handleMessage(Message msg) {
			super.handleMessage(msg);

			switch (msg.what) {
			case 0:
				// 绑定位置监听器
				if (!isCanceled)
					return;

				mMapManager.getLocationManager().requestLocationUpdates(mll);
				mMapManager.start();
				isCanceled = false;

				Log.i(TAG, "开始定位");
				break;
			case 1:
				// 取消绑定位置监听器
				if (isCanceled)
					return;

				mMapManager.getLocationManager().removeUpdates(mll);
				mMapManager.stop();
				isCanceled = true;

				Log.i(TAG, "停止定位");
				break;
			case 2:
				if (!isCanceled) {
					mMapManager.getLocationManager().removeUpdates(mll);
					mMapManager.stop();
				}
				mMapManager.getLocationManager().requestLocationUpdates(mll);
				mMapManager.start();
				isCanceled = false;

				Log.i(TAG, "重启定位");
				break;
			}
		}
	}

	/** 获取地址 */
	public String getAddress() {
		return address;
	}

	/** 获取当前位置 */
	public Location getCurrentLocation() {
		return currentLocation;
	}

	/** 位置监视器 */
	private class MyLocationListener implements LocationListener {
		public void onLocationChanged(Location locaiton) {
			if (null != currentLocation && currentLocation.getLatitude() == locaiton.getLatitude()
					&& currentLocation.getLongitude() == locaiton.getLongitude())
				return;

			currentLocation = locaiton;
			Log.i(TAG, "获取到了位置!");
			// 转换坐标为地址
			mSearch.reverseGeocode(new GeoPoint((int) (locaiton.getLatitude() * 1E6),
					(int) (locaiton.getLongitude() * 1E6)));
		}
	}

	/** 搜索监视器 */
	private class MyMKSearchListener implements MKSearchListener {
		public void onGetAddrResult(MKAddrInfo res, int error) {
			address = null;

			if (error != 0)
				return;

			address = res.strAddr;
		}

		public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
		}

		public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
		}

		public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
		}

		public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
		}
	}
}
分享到:
评论

相关推荐

    百度定位封装

    百度地图API提供了多种定位方式,如网络定位、GPS定位、混合定位等,可以根据不同的场景需求选择合适的定位模式。网络定位主要依赖于基站信息,适合室内或GPS信号弱的环境;GPS定位则利用卫星信号,精度较高,但可能...

    Android GPS定位源码

    在Android系统中,GPS定位是移动应用开发中的关键部分,它允许用户获取精确的位置信息,为导航、社交、天气预报等功能提供支持。本教程将深入探讨Android GPS定位的源码实现,包括GPS定位、基站定位和WiFi定位。 一...

    Android获取GPS定位(获取经纬度)

    在Android开发中,获取GPS定位是一项基础且重要的功能,它能帮助应用提供精确的位置服务,例如导航、位置分享等。本文将深入探讨如何在Android中实现GPS定位,获取经纬度坐标。 首先,我们需要理解Android系统中的...

    Android_GPS_WIFI_网络定位

    在MapABCAndroidApiDemos这个项目中,通常会包含一系列关于地图API的示例代码,可能包括使用GPS、WIFI和网络定位功能来显示用户当前位置、路径规划、地理编码(将地址转换为坐标)和反地理编码(将坐标转换为地址)...

    Android GPS定位(获取经纬度)

    总的来说,Android的GPS定位涉及多个层面,包括权限管理、定位API的使用和优化。通过封装成一个管理类,我们可以更高效地在应用中集成和控制定位功能。在实际项目中,还应根据具体需求调整和扩展这些基础概念。

    安卓百度地图定位--从百度地图中剥离出来的

    在安卓平台上,集成百度地图定位服务是开发移动应用的一个常见需求。百度地图API提供了一整套定位、地图显示以及路线规划等功能,可以帮助开发者构建出功能丰富的地理位置应用。本知识点主要聚焦于从百度地图中剥离...

    安卓GPS定位源码

    总之,【安卓GPS定位源码】结合了Android的Location API和ArcGIS的强大功能,提供了灵活且高效的定位解决方案。开发者可以通过理解并研究源码中的这些关键组件和逻辑,学习如何在自己的应用中实现类似的功能。这不仅...

    android地图定位

    本项目主要涉及了Android手机端的地图定位以及截图功能,利用了百度地图API,为用户提供了一个直观且便捷的地理定位服务。以下将详细介绍这个项目中的关键知识点。 1. **Android定位服务**: Android系统提供了...

    android 百度地图

    总结来说,将Android的百度地图API与PhoneGap结合,可以让我们在跨平台的应用中利用百度地图的强大功能,同时保持开发的简洁性和高效性。通过合理的插件设计和通信机制,我们可以在Web层面上轻松调用地图功能,从而...

    Android中第三方SDK集成之百度地图集成_案例一

    百度地图提供了两种定位模式:网络定位和GPS定位。网络定位依赖移动网络或Wi-Fi信号,而GPS定位则需要设备支持GPS硬件。通过`LocationClient`对象和相应的监听器,开发者可以实时获取定位信息。 4. **卫星图显示**...

    百度定位的一个小Demo

    1. **API接入**:首先,开发者需要在百度地图开放平台注册并获取API密钥(AK),这是使用百度定位服务的前提。在Demo中,这个密钥会被用于初始化定位服务。 2. **初始化定位服务**:在Android或iOS应用中,需要在...

    安卓GPS定位源代码

    在安卓平台上进行GPS定位开发是一项基础且重要的任务,它涉及到移动应用中的位置服务、导航、地理围栏等功能。本文将详细解析基于Java语言的安卓GPS定位源代码,并提供相关知识点。 1. 安卓权限管理: 在安卓系统...

    Java-API和Android-API

    7. **传感器和位置服务**:`android.hardware`和`android.location`,提供与设备硬件交互的能力,如GPS定位。 8. **图形和动画**:`android.graphics`和`android.animation`,用于绘制2D图形和实现动态效果。 ...

    百度地图,显示闸站分布,以及切换闸站位置,上传闸站图片信息的cordova插件,包含百度地图和百度定位库文件

    `cordova-plugin-sluiceMap`就是这样一个插件,它封装了对百度地图API的调用,使得在Cordova应用中调用地图和定位服务变得更加简单。 3. **百度定位服务**:百度地图API包含了定位服务,能够获取设备的经纬度坐标。...

    基于移动终端的GPS监控系统设计与实现 (2).pdf

    《基于移动终端的GPS监控系统设计与实现》探讨的是如何构建一个使用移动设备(如手机、PDA或智能手表)作为GPS定位和信息查询工具的监控系统。传统的GPS监控系统通常仅限于“车辆-监控中心”的模式,乘客无法获取...

    android定位

    "Android定位"这个主题涵盖了许多关键技术点,主要包括Android系统提供的定位API、网络定位、GPS定位以及如何封装工具类来简化定位操作。下面我们将深入探讨这些知识点。 首先,Android系统提供了多种定位接口,...

    火星坐标定位android/ios地图转换

    在IT行业中,尤其是在移动开发领域,地图应用是一个重要的组成部分。对于在中国使用的地图应用,由于国家安全考虑,中国的地理位置信息使用了一种特殊的坐标系,通常被称为“火星坐标”或GCJ-02坐标系。这个坐标系统...

    基于Android手机的好友定位系统的探究与实现

    【基于Android手机的好友定位系统】的实现是利用了现代移动通信技术和GPS定位技术的结合。在Android平台上,好友定位系统能够实现用户间位置信息的实时共享,这得益于Android对GPS功能的良好支持以及网络通信技术的...

Global site tag (gtag.js) - Google Analytics