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

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

想了想不如做一个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

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

  1. [android学习]__使用百度地图开放api编写地图定位app

    前言 在前面我已经记录关于如何使用百度地图api,以及如何配置相关的androidstudio配置了,接下来将记录如何使用百度地图api开发简单的地图定位apk,我将决定不定期持续更新本篇笔记,在每个 ...

  2. Android 系统api实现定位及使用百度提供的api来实现定位

    目前在国内使用定位的方法主要是 1. Android系统提供的 LocationManager locationManager = (LocationManager) getSystemService ...

  3. 安卓开发笔记①:利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)

    高德地图开发时需要导入的包在下面的网盘链接中:(由于高德地图api更新得太快,官网上最新的包使用起来没有之前的方便,所以以下提供最全面的原始包) 链接:http://pan.baidu.com/s/1 ...

  4. Android 仿微信调用第三方应用导航(百度,高德、腾讯)

    实现目标 先来一张微信功能截图看看要做什么  其实就是有一个目的地,点击目的地的时候弹出可选择的应用进行导航. 大脑动一下,要实现这个功能应该大体分成两步: 底部弹出可选的地图菜单进行展示 点击具体菜 ...

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

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

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

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  7. Android地图开发之地图的选择

    做lbs开发差不多快2年了,地图相关的产品也差不多做了3个了,用到过的地图包括google地图.高德地图.百度地图.图吧.Osmdroid,今天总结下,方便大家开发时选择合适的地图. 首先说定位模块选 ...

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

    如题:android 高德地图出现[定位失败key鉴权失败] 原因:使用的是debug模式下的SHA1,发布的版本正确获取SHA1的方式见: 方法二使用 keytool(jdk自带工具),按照如下步骤 ...

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

    官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发人员们提供了例如以下类型的地图覆盖物: ...

随机推荐

  1. Solr 倒排索引

     正排索引(正向索引):正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档. 正排表结构如图1所示,这种组织方法在建立索引的 ...

  2. springMVC视图解析器——InternalResourceViewResolver(转)

    springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...

  3. 关于C++中用两个迭代器方式初始化string的知识

    string(iter1, iter2); 第一点:两个迭代器必须指向同一个容器. 第二点:iter2必须>=iter1. 第三点:假设iter1等于iter2,那么结果为空[] 另外一个比較特 ...

  4. numpy 高阶函数 —— np.histogram

    np.diff(a, n=1, axis=-1):n 表示差分的阶数: >> x = np.array([1, 2, 4, 7, 0]) >> np.diff(x) array ...

  5. 关于stm32加不进.h文件的问题

    把路径也设置好了,但是.h文件加入不进去, 编译的时候.h文件也出来了 那是因为.h或对应的.c文件中存在错误,改掉错误就能成功,有时候keil不会报错,可能是因为定义变量没有定义好 如果显示某个变量 ...

  6. Shiro的Filter机制详解---源码分析(转)

    Shiro的Filter机制详解 首先从spring-shiro.xml的filter配置说起,先回答两个问题: 1, 为什么相同url规则,后面定义的会覆盖前面定义的(执行的时候只执行最后一个). ...

  7. Xvisor ARM32 启动分析

    Linux内核历史悠久,特性丰富,但是代码量庞大,各个子系统交叉繁琐.对于想要将操作系统内核各个特性研究一遍的人,有时候也只好"望Linux兴叹".Xvisor是一个较新的Type ...

  8. [Node] Run Any Version of a Node Tool with npx

    As node projects evolve, new features are added all the time. This results in different errors or re ...

  9. kafka集群原理介绍

    目录 kafka集群原理介绍 (一)基础理论 二.配置文件 三.错误处理 kafka集群原理介绍 @(博客文章)[kafka|大数据] 本系统文章共三篇,分别为 1.kafka集群原理介绍了以下几个方 ...

  10. 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令

    (内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...