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

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

想了想不如做一个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. Vue的全选功能实现思路

    全选功能的实现主要分两步: 1. 点击全选框选中所有选择框. 2. 当所有选择框都被选中时,勾选全选框. 详细思路: 1. 点击全选框选中所有选择框: 给全选框绑定一个值,然后添加change时间,当 ...

  2. CISP/CISA 每日一题 11

    CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...

  3. Oracle实现数据不存在则插入,数据存在则更新(insert or update)

    思路是写一个函数,先按条件查询数据,假设查询到数据则更新.假设没有查询到数据则插入: create or replace function fn_merge_index(statdate in dat ...

  4. android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动            1.先简单设置一个闹钟提醒事件: //设置闹钟 mSetting.setOnClickListener ...

  5. JS/CSS 全屏幕导航 – 从上到下动画

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  6. 【JAVASE】Java同一时候抛出多个异常

    Java有异常抛出后.跳出程序.一般无法运行接下来的代码. 大家做登陆功能.常常会实username和password的登陆校验,username或者password错误.假设通常是提示usernam ...

  7. Android实践 -- 对apk进行系统签名

    对apk进行系统签名 签名工具 网盘下载 ,需要Android系统的签名的文件 platform.x509.pem 和 platform.pk8 这个两个文件在Android源码中的 ./build/ ...

  8. 算法中的优化问题(optimization problem)

    和多数算法不同的是,有些问题的答案不只一个,而是需要在多个答案中,按照一定标准选出"最佳"答案,这类问题就统称为"优化问题"(optimization prob ...

  9. CentOS7安装docker 18.06

    原文:CentOS7安装docker 18.06 一.CentOS Docker 安装 参考docker 官方网站:https://docs.docker.com/install/linux/dock ...

  10. 适用android的MVP:怎样组织展示层

    原文 MVP for Android:How to organize presentation layer http://antonioleiva.com/mvp-android/ 译文 MVP(Mo ...