首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Android 封装了GPS定位与百度移动mapAPI定位

2012-12-27 
Android 封装了GPS定位与百度移动地图API定位共三个类:第一个:MainForm.java/** * br/ * Title: MainFor

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) {}}}

热点排行