论坛首页 移动开发技术论坛

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

浏览 4043 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-12-21  
共三个类:

第一个: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) {
		}
	}
}
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics