为android封装的百度定位组件

原创
2013/09/10 11:10
阅读数 1K
package com.android.location;

import java.math.BigDecimal;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

/**
 * 利用百度地图定位
 * 
 * @author Esa
 */
public class LocationService {

	private String TAG = "Location";
	public static final int DATA = 6;
	private LocationClient client;
	private LocationClientOption option;
	private Handler handler;

	/**
	 * 构造函数
	 */
	public LocationService(Context context) {
		client = new LocationClient(context);// 实例化定位类
		client.registerLocationListener(new BDLocationListener() {

			@Override
			public void onReceiveLocation(BDLocation location) {
				if (location != null) {
					int locType = location.getLocType();// 获取定位类型,161网络定位 61GPS定位
					Log.w(TAG, "Location type = " + locType);
					if (locType == BDLocation.TypeNetWorkLocation || locType == BDLocation.TypeGpsLocation) {
						double latitude = location.getLatitude();// 返回维度
						double longitude = location.getLongitude();// 返回经度
						String address = location.getAddrStr();// 返回地理信息
						float radius = -1;
						if (location.hasRadius()) {
							radius = location.getRadius();// 获取定位精度半径,单位是米
							BigDecimal b = new BigDecimal(radius);
							radius = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
						}
						if (handler != null) {
							StringBuffer json = new StringBuffer();
							json.append("{\"locType\":\"").append(locType == BDLocation.TypeNetWorkLocation ? "网络定位" : "GPS定位").append("\",");
							json.append("\"latitude\":\"").append(latitude).append("\",");
							json.append("\"longitude\":\"").append(longitude).append("\",");
							json.append("\"radius\":\"").append(radius).append("\",");
							json.append("\"address\":\"").append(address).append("\"}");
							Message msg = handler.obtainMessage();
							msg.what = DATA;
							msg.obj = json.toString();
							Log.d(TAG, "定位结果 => " + json.toString());
							handler.sendMessage(msg);
						}
					}
				}
			}

			@Override
			public void onReceivePoi(BDLocation location) {
			}

		});// 设置监听

		option = new LocationClientOption();// 实例化定位参数
		option.setAddrType("all");// 设置返回地理信息
		option.setOpenGps(true);
		// option.setPriority(LocationClientOption.GpsFirst);
		option.setCoorType("bd09ll");// 设置为百度坐标系
		option.disableCache(true);// 不使用缓存
		option.setScanSpan(1000 * 3);// 定位间隔
		client.setLocOption(option);// 设置参数
	}

	/**
	 * 通过经纬度获取地理信息
	 * 
	 * @param latitude
	 * @param longitude
	 * @return
	 */
	public synchronized String getAddress(String latitude, String longitude) {
		HttpClient client = new DefaultHttpClient();
		HttpGet get = new HttpGet(String.format("http://api.map.baidu.com/geocoder/v2/?ak=%s&location=%s,%s&output=%s&pois=%s", "C2ab471c7883b11890e509c2abb27b56", latitude, longitude, "json", "0"));
		try {
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
				return null;
			}
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				String json = EntityUtils.toString(entity, "UTF-8");
				JSONObject object = new JSONObject(json);
				int status = object.getInt("status");
				if (status == 0) {
					String address = object.getJSONObject("result").getString("formatted_address");
					if (address != null && !"".equals(address.trim())) {
						return address;
					}
				}
			}
		} catch (Exception e) {
			Log.e(TAG, "", e);
		}
		return null;
	}

	/**
	 * 启动定位
	 * 
	 * @param handler
	 *            接收的handler
	 */
	public void start(Handler handler) {
		this.handler = handler;
		this.start();
	}

	/**
	 * 开启定位
	 */
	private void start() {
		if (client.isStarted()) {
			Log.w(TAG, "定位服务 正在运行");
		} else {
			Log.d(TAG, "开启定位");
			client.start();
		}
	}

	/**
	 * 是否正在定位
	 * 
	 * @return
	 */
	public boolean isStarted() {
		return client.isStarted();
	}

	/**
	 * 停止定位
	 */
	public void stop() {
		Log.d(TAG, "定位服务 关闭");
		client.stop();
		handler = null;
	}
}

使用方法:

LocationService service = new LocationService(Context);
service.start(Handler);
展开阅读全文
加载中

作者的其它热门文章

1
4 收藏
分享
打赏
0 评论
4 收藏
1
分享
返回顶部
顶部