Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!

这几天的项目不是非常紧。于是想为未来可能要做的项目做一些技术储备。

下一个项目非常有可能是定位开发,须要用到手机定位功能,于是查了查如今比較流行的第三方定位,最火的基本上就是百度定位>高德定位>腾讯定位了。

想了想不如做一个DEMO把三种定位方式混合一下试试。

BaiduLocTool.java

package com.dhcc.mixlocation;

import android.content.Context;

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

public class BaiduLocTool implements BDLocationListener{

	public LocationClient mLocationClient;

	public LocationClient getmLocationClient() {
		return mLocationClient;
	}

	private Context mContext;

	public BaiduLocTool(Context context){

		mContext=context;
	}

	public void init(){

		mLocationClient = new LocationClient(mContext);

		InitLocation();

		mLocationClient.registerLocationListener(this);

		mLocationClient.start();
	}

	private void InitLocation(){
		LocationClientOption option = new LocationClientOption();
		option.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式
		option.setScanSpan(1000);//设置发起定位请求的间隔时间为5000ms
		option.setIsNeedAddress(true);
		mLocationClient.setLocOption(option);
	}

	@Override
	public void onReceiveLocation(BDLocation location) {
		// TODO Auto-generated method stub
		((MainActivity)mContext).phoneCall("百度定位:"+"纬度:"+location.getLatitude()+" | "+"经度:"+location.getLongitude()+" | "+"反地理编码:"+location.getAddrStr());
		mLocationClient.stop();
	}

	public void destroyLocManager(){
		if(mLocationClient!=null)
		mLocationClient.stop();
		mLocationClient=null;
	}

}

GaodeLocTool.java

package com.dhcc.mixlocation;

import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;

public class GaodeLocTool implements AMapLocationListener{

	Context mContext;
	private LocationManagerProxy mLocationManagerProxy;

	public GaodeLocTool(Context context){

		this.mContext=context;

	}

	public void init(){

		mLocationManagerProxy = LocationManagerProxy.getInstance(mContext);

		  mLocationManagerProxy.requestLocationData(
	                LocationProviderProxy.AMapNetwork, 1000, 15, this);
	        mLocationManagerProxy.setGpsEnable(true);

	}

	@Override
	public void onLocationChanged(Location location) {
		// TODO Auto-generated method stub
		Log.e("onLocationChanged", "Location");
	}

	@Override
	public void onProviderDisabled(String arg0) {
		// TODO Auto-generated method stub
		Log.e("onProviderDisabled", "onProviderDisabled");
	}

	@Override
	public void onProviderEnabled(String arg0) {
		// TODO Auto-generated method stub
		Log.e("onProviderEnabled", "onProviderEnabled");
	}

	@Override
	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
		// TODO Auto-generated method stub
		Log.e("onStatusChanged", "onStatusChanged");
	}

	@Override
	public void onLocationChanged(AMapLocation location) {
		// TODO Auto-generated method stub
		Log.e("onLocationChanged", "AMapLocation");
		((MainActivity)mContext).phoneCall("高德定位:"+"混合定位方式:"+location.getProvider()+" | "+"纬度:"+location.getLatitude()+" | "+"经度:"+location.getLongitude()+" | "+"反地理编码:"+location.getAddress());
		mLocationManagerProxy.removeUpdates(this);
	}

	public void destroyLocManager() {

	        if (mLocationManagerProxy != null) {
	        	mLocationManagerProxy.removeUpdates(this);
	        	mLocationManagerProxy.destroy();
	        }
	        mLocationManagerProxy = null;

	}

}

TencentLocTool.java

<span style="font-size:10px;">package com.dhcc.mixlocation;

import android.content.Context;
import android.util.Log;

import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;

public class TecentLocTool implements TencentLocationListener {

	String LocInfo;
	String task;
	Context main;
	TencentLocationManager mLocationManager;

	public String getLocInfo() {
		return LocInfo;
	}

	public void setLocInfo(String locInfo) {
		LocInfo = locInfo;
	}

	public TecentLocTool(Context main) {
		this.main = main;
		mLocationManager=TencentLocationManager.getInstance(main);

	}

	public void init(){
		int error = TencentLocationManager.getInstance(main)
				.requestLocationUpdates(
						TencentLocationRequest
								.create().setInterval(5000)
								.setRequestLevel(
										TencentLocationRequest.REQUEST_LEVEL_NAME), this);
		if (error == 0) {

			Log.e("监听状态:", "监听成功!");

		} else if (error == 1) {

			Log.e("监听状态:", "设备缺少使用腾讯定位SDK须要的基本条件");

		} else if (error == 2) {

			Log.e("监听状态:", "配置的 key 不对");

		}

	}

	/**
	 * @param location
	 *            新的位置
	 * @param error
	 *            错误码
	 * @param reason
	 *            错误描写叙述
	 */
	@Override
	public void onLocationChanged(TencentLocation location, int error,
			String reason) {
		// TODO Auto-generated method stub
		if (TencentLocation.ERROR_OK == error) {

			double lat = location.getLatitude();// 纬度
			double lot = location.getLongitude();// 经度
			double altitude = location.getAltitude();// 海拔
			float accuracy = location.getAccuracy();// 精度
			String nation = location.getNation();// 国家
			String province = location.getProvince();// 省份
			String city = location.getCity();// 城市
			String district = location.getDistrict();// 区
			String town = location.getTown();// 镇
			String village = location.getVillage();// 村
			String street = location.getStreet();// 街道
			String streetNo = location.getStreetNo();// 门号

			Log.e("定位信息:", lat + " | " + lot + " | " + altitude + " | "
					+ accuracy + " | " + nation + " | " + province + " | "
					+ city + " | " + district + " | " + town + " | " + village
					+ " | " + street + " | " + streetNo);

			task = lat + " | " + lot + " | " + altitude + " | " + accuracy
					+ " | " + nation + " | " + province + " | " + city + " | "
					+ district + " | " + town + " | " + village + " | "
					+ street + " | " + streetNo + " | ";

			String provider=location.getProvider();//定位方式
			if (TencentLocation.GPS_PROVIDER.equals(provider)) {
			    // location 是GPS定位结果
				Log.e("定位方式:","GPS");
				((MainActivity)main).phoneCall("腾讯定位:"+task+"GPS");
			} else if (TencentLocation.NETWORK_PROVIDER.equals(provider)) {
			    // location 是网络定位结果
				Log.e("定位方式:","NetWork");
				((MainActivity)main).phoneCall("腾讯定位:"+task+"NetWork"+" | "+location.getAddress());
				Log.e("地址:", location.getAddress());
			}
			mLocationManager.removeUpdates(this);
		} else {

			Log.e("reason:", reason);
			Log.e("error:", error + "");

		}

	}

	/**
	 * @param name
	 *            GPS,Wi-Fi等
	 * @param status
	 *            新的状态, 启用或禁用
	 * @param desc
	 *            状态描写叙述
	 */
	@Override
	public void onStatusUpdate(String name, int status, String desc) {
		// TODO Auto-generated method stub
		Log.e("name:", name);
		Log.e("status:", ""+status);
		Log.e("desc:", desc);

	}

	public void destroyLocManager() {

		if(mLocationManager!=null)
			mLocationManager.removeUpdates(this);
			mLocationManager=null;
	}

}</span><span style="font-size:18px;">
</span>

记录一下开发中遇到的问题:

百度地图:没什么问题。用起来非常方便。

高德地图:LocationProviderProxy.AMapNetwork  仅仅支持网络定位,无法纯GPS定位,假设想要纯GPS定位就必须把这个參数改成LocationManagerProxy.GPS_PROVIDER。

非常蛋疼,这里须要自己来逻辑推断一下。

腾讯地图:假设想要纯GPS定位的话,须要把定位坐标改成地球坐标:mLocationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_WGS84);

可是面临的问题是这个坐标没法反地理编码。假设想反地理编码,就必须把坐标改成火星坐标。mLocationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02);

可是这样又没法纯GPS定位。所以我个人认为腾讯定位仅仅要用他的网络定位就好了,不要用他的GPS定位了 好麻烦。

在我所在的位置測试的话,三种定位的网络定位,反地理编码最准确的是:腾讯定位,其次是百度定位。最差的是高德定位。

项目源代码下载地址:

http://download.csdn.net/detail/jasoncol_521/8775663

时间: 2024-08-23 04:12:51

Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!的相关文章

Android Studio下Android应用开发集成百度语音合成使用方法样例

转载请注明来源: http://blog.csdn.net/kjunchen/article/details/51093134 Android Studio下Android应用开发集成百度语音合成使用方法样例 首先,语音合成是指将文本信息转换成声音.意思就是将文本转化为声音,让你的应用开口说话.国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞. 本博文集成的是百度语音合成,其主要特点是: 完全永久免费 业界首创完全永久免费新形式,为开发者提供最流畅最自然的语音合成服务.完全免费,永久使

APICloud打开三方地图整合(百度,高德,腾讯,苹果自带)

一直想系统的整理打开地图的方法,今天抽时间把了百度,高德,腾讯,苹果自带地图都整理出来了,闲话不多说,直接上干货 ----------------------------------------------------------------------code start---------------------------------------------------------------------------------------------------- <!DOCTYPE HT

推断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

<?php // *** 配置文件(表示区域的三维数组)其内的点.必须按顺时针方向依次给出. $area = array( // 天通苑店 0 => array( array('x'=>116.38295, 'y'=>40.09416), array('x'=>116.44037, 'y'=>40.095898), array('x'=>116.448275,'y'=>40.083313), array('x'=>116.448455,'y'=>

Android地图开发之地图的选择

做lbs开发差不多快2年了,地图相关的产品也差不多做了3个了,用到过的地图包括google地图.高德地图.百度地图.图吧.Osmdroid,今天总结下,方便大家开发时选择合适的地图. 首先说定位模块选择,高德地图.百度地图现在都有了单独的地位sdk,且都支持全球定位,都是非常不错的选择.我现在做的项目对定位要求很高,现在的选择是gps定位使用系统定位方式,基站定位使用百度定位,gps连接成功使用系统定位接口,gps断开切换到百度基站定位. gps定位,百度和高德都用过,但是测试发现没有同类产品统

最新基于高德地图的android进阶开发(3)GPS地图定位

1.下面示例是一个简单的定位,来自官网,对这些源码加了一些注释,这样看起来可能会更容易理解一点. 2.直接上源码 androidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dragon.arnav&

Android中级篇之百度地图SDK v3.5.0-一步一步带你仿各大主流APP地图定位移动选址功能

定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址,如百度外卖.爱鲜蜂收货地址等等:其中他们大多数是可以让我们在地图上移动选址.就如下面这段GIF演示的一样: 尽信书,不如无书-能学到什么? 1.地图状态MapStatus类及监听setOnMapStatusChangeListener 2.定位LocationClient类 3.反地理编码GeoCoder类 工欲善其事必先利其器-申请Key 百度地图访问应用(AK)申请地址:http://lbsyun.baidu

android 百度地图系列之地图初始化及定位

在Android应用中,很多时候需要地图功能,回顾过去写的项目和百度地图api,开始总结一下Android百度地图的实现.首先总结一下怎么开始一个Android百度地图功能. 当使用百度地图的时候,提到一个appkey."在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联.因此,您必须先有百度帐户,才能获得开发密钥.并且,该密钥与您创建的过程名称有关.Key地址为:http://lbsyun.baidu.com/apiconsole/

android 高德地图出现【定位失败key鉴权失败】

如题:android 高德地图出现[定位失败key鉴权失败] 原因:使用的是debug模式下的SHA1,发布的版本正确获取SHA1的方式见: 方法二使用 keytool(jdk自带工具),按照如下步骤进行操作:1.运行进入控制台. 2.在弹出的控制台窗口中输入 cd .android 定位到 .android 文件夹. 3.继续在控制台输入命令.开发模式使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore发布模式使用 ap

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终