文档章节

为android封装的百度定位组件

Oneself丶x
 Oneself丶x
发布于 2013/09/10 11:10
字数 512
阅读 657
收藏 4
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);

© 著作权归作者所有

Oneself丶x

Oneself丶x

粉丝 36
博文 23
码字总数 8233
作品 2
海淀
高级程序员
私信 提问
android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

Android精选源码 app 版本更新、下载完毕自动自动安装(http://www.apkbus.com/thread-603095-1-1.html) android指针式分数仪表盘(http://www.apkbus.com/thread-603097-1-1.html) ANdroid蓝牙......

Android爱开源
2018/10/09
0
0
Android 百度地图开发之MyLocationOverlay,PopupOverlay的使用

这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOverlay和PopupOverlay两个地图覆盖物的使用,Overlay是“图层”或“覆盖物”的意思,MyLocationOverlay从名字上面理解就是我...

等待流星
2013/12/10
0
0
Android中Intent组件详解

Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件。Intent 本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动...

Remix_jx
2014/10/16
0
0
百度地图SDK地图学习——实现定位功能

之前已经完成了百度地图SDK和百度定位SDK的配置。 http://my.oschina.net/u/1051634/blog/180880 实现百度定位的功能,最好仔细看看官方的文档,看了好几次才有点明白。 开发指南:http://de...

HenryHsu
2013/12/03
0
1
Android 百度地图定位(手动+自动)

近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的。我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位...

带梦想一7飞
2013/07/10
0
1

没有更多内容

加载失败,请刷新页面

加载更多

生产者消费者问题(PV操作)

一、明确定义 要理解生产消费者问题,首先应弄清PV操作的含义:PV操作是由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减...

shzwork
30分钟前
0
0
重新认识网络通信协议

OSI网络分层 应用层 http, smtp,pop3这些都属于应用层协议 为用户的应用程序提供服务 表示层 确保一个系统的应用层发送的信息被另一个系统的应用层接收到 会话层 通过传输层建立数据传输的通...

最胖的瘦子
41分钟前
1
0
【转】分布式数据流的轻量级异步快照

本篇翻译自论文:Lightweight Asynchronous Snapshots for Distributed Dataflows,Flink的容错快照模型即来源于该论文。原文地址:https://arxiv.org/pdf/1506.08603.pdf 分布式数据流的轻量...

yiduwangkai
43分钟前
0
0
java使用反射机制设置私有成员变量的值

写一个方法:public void setProperty(Objectobj, String propertyName, Object value){}, 此方法可将obj对象中名为propertyName的属性的值设置为value。(这里不知道obj对象的propertyNam...

群星纪元
49分钟前
0
0
用 Tapestry 的方式在页面模板中加入注释

<span jwcid="$remove$">这里是注释</span>

LeoXu
50分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部