前言:最近在做一个应用,要用到LBS定位,本想自己写,可技术还是不到位,而且时间也不多了,还是以先实现为主吧,然后就研究百度的LBS定位,谷歌的也有LBS定位服务,但总感觉谷歌大神被赶到香港以后,就一直不稳定,不知道LBS怎么样,估计也不行,所以直接就用了百度定位SDK,但百度的定位SDK每日的最大访问量为10W,所以软件用户量大了的话,还是自己写定位代码吧,像我这样的前期用用也还无所谓,毕竟前期用户量不可能这么大的。

相关说明:

根据《百度定位SDK开发指南》,其中说到在V4.0以后都要申请KEY,但现在的KEY申请已经相当复杂了,变成了根应用相关的,奶奶个熊,我琢磨了好久也不知道申请的对不对,但我在程序中把KEY去掉,仍然是可以定位的,真不知道这是需要KEY还是不需要KEY。《指南》中说,地图初始化时用到KEY,可能这也说明在纯定位时,是不需要KEY的。既然不需要KEY,那么也就无法限定使用次数了。哈哈,好像我发现了什么。

 既然不需要KEY,但源码是又要添加上SetKey()这句,而且论坛中很多人说设置KEY错误的问题(http://bbs.lbsyun.baidu.com/viewthread.php?tid=2859&extra=page%3D1),我这运行机成功的很不踏实啊。=_=!!

一、相关资料

《android使用百度定位SDK方法及错误处理》:http://mobile.51cto.com/aprogram-376690.htm (这篇文章不错,将定位的接口封装成了一个类,直接调用就可以了)

二、实现定位

效果图:

1、导入库文件

在相关下载最新的库文件。将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定locSDK4.0.jar,确定后返回。这样您就可以在程序中使用百度地理围栏SDK了。

2、设置AndroidManifest.xml

2.1. 在application标签中声明service组件,每个app拥有自己单独的定位service

2.2 声明使用权限

3、XML内容

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

android:id="@+id/textview"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textColor="#ff00ff" >

android:id="@+id/ReLBS_button"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_below="@+id/textview"

android:text="重新定位"/>

4、JAVA页面

package com.example.try_lbs_baidu;

/**

* 尝试百度定位SDK

* @author harvic

* @date 2013-12-28

*/

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.baidu.location.BDLocation;

import com.baidu.location.BDLocationListener;

import com.baidu.location.LocationClient;

import com.baidu.location.LocationClientOption;

public class MainActivity extends Activity {

private TextView mTv = null;

public LocationClient mLocationClient = null;

public MyLocationListenner myListener = new MyLocationListenner();

public Button ReLBSButton=null;

public static String TAG = "msg";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mTv = (TextView)findViewById(R.id.textview);

ReLBSButton=(Button)findViewById(R.id.ReLBS_button);

mLocationClient = new LocationClient( this );

/**——————————————————————————————————————————————————————————————————

* 这里的AK和应用签名包名绑定,如果使用在自己的工程中需要替换为自己申请的Key

* ——————————————————————————————————————————————————————————————————

*/

//      mLocationClient.setAK("697f50541f8d4779124896681cb6584d");

//      mLocationClient.setAK("z4nqERrqxnhNzT5VOGNVRt80");

mLocationClient.registerLocationListener( myListener );

setLocationOption();//设定定位参数

mLocationClient.start();//开始定位

// 重新定位

ReLBSButton.setOnClickListener(new Button.OnClickListener() {

public void onClick(View v) {

// TODO Auto-generated method stub

if (mLocationClient != null && mLocationClient.isStarted())

mLocationClient.requestLocation();

else

Log.d("msg", "locClient is null or not started");

}

});

}

//设置相关参数

private void setLocationOption(){

LocationClientOption option = new LocationClientOption();

option.setOpenGps(true);

option.setAddrType("all");//返回的定位结果包含地址信息

option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02

option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms

option.disableCache(true);//禁止启用缓存定位

option.setPoiNumber(5);    //最多返回POI个数

option.setPoiDistance(1000); //poi查询距离

option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息

mLocationClient.setLocOption(option);

}

@Override

public void onDestroy() {

mLocationClient.stop();//停止定位

mTv = null;

super.onDestroy();

}

/**

* 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中

*/

public class MyLocationListenner implements BDLocationListener {

@Override

//接收位置信息

public void onReceiveLocation(BDLocation location) {

if (location == null)

return ;

StringBuffer sb = new StringBuffer(256);

sb.append("time : ");

sb.append(location.getTime());

sb.append("\nreturn code : ");

sb.append(location.getLocType());

sb.append("\nlatitude : ");

sb.append(location.getLatitude());

sb.append("\nlontitude : ");

sb.append(location.getLongitude());

sb.append("\nradius : ");

sb.append(location.getRadius());

if (location.getLocType() == BDLocation.TypeGpsLocation){

sb.append("\nspeed : ");

sb.append(location.getSpeed());

sb.append("\nsatellite : ");

sb.append(location.getSatelliteNumber());

} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){

/**

* 格式化显示地址信息

*/

sb.append("\naddr : ");

sb.append(location.getAddrStr());

}

sb.append("\nsdk version : ");

sb.append(mLocationClient.getVersion());

sb.append("\nisCellChangeFlag : ");

sb.append(location.isCellChangeFlag());

mTv.setText(sb.toString());

Log.i(TAG, sb.toString());

}

//接收POI信息函数,我不需要POI,所以我没有做处理

public void onReceivePoi(BDLocation poiLocation) {

if (poiLocation == null) {

return;

}

}

}

}

基本步骤:

1、初始化:mLocationClient = new LocationClient( this );

2、设定监听函数,也就是说把结果返回后要怎么处理的函数:mLocationClient.registerLocationListener( myListener );

3、设定定位参数:setLocationOption();

4、开始定位:mLocationClient.start();

注意一点:

1、在开始定位之后,如果不调用mLocationClient.stop();来停止定位,那么程序会每隔几秒重新定位一次,非常浪费资源。为了验证这一点,我在程序中,在onReceiveLocation()函数中,使用Log.i(TAG, sb.toString());记录了每次接收到的位置信息并记录在LogCat中,下面是大概半小时后,也就是我写这篇文章的时间,“msg”标签的信息量竟然到了1777,可见程序定位了多少次!!!!!

不知道怎么回事,刚才大约有一个小时定位都不成功,又返回errorCode:0;然后过了一段时间,自己又成功了,而且论坛里说有时定位准,有时定位不准,MY GOD,这百度到底行不行啊。这样时好时坏,搞得很不踏实啊。

附上errorCode值的含义吧,找了半天还是在论坛里找到的,使用说明中,根本没讲,哎,中国这些帮助文档啊,无语啦!!

百度基站定位错误返回码

61 : GPS定位结果

62 : 扫描整合定位依据失败。此时定位结果无效。

63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。

65 : 定位缓存的结果。

66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果

67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果

68 : 网络连接失败时,查找本地离线定位时对应的返回结果

161: 表示网络定位结果

162~167: 服务端定位失败。

三、由经纬度计算两点间的距离

这种公式我当然是不知道的,百度下,代码公式啥啥的都有,直接用就OK,至于正确性嘛,应该是对的吧,这里记录一下

(km)

1.Lat1 Lung1表示A点经纬度,Lat2 Lung2表示B点经纬度;

2.a=Lat1–Lat2为两点纬度之差b=Lung1 -Lung2 为两点经度之差;

3.6378.137为地球半径,单位为千米;

计算出来的结果单位为千米。

代码

有人(http://panyee.cnblogs.com/archive/2006/07/04/442771.html)从google map里面提取了计算代码,有验证的说是正确的,反正我是不会算的了,我的软件中也是用这段代码,如下

private const double EARTH_RADIUS = 6378.137;

private static double rad(double d)

{

return d * Math.PI / 180.0;

}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)

{

double radLat1 = rad(lat1);

double radLat2 = rad(lat2);

double a = radLat1 - radLat2;

double b = rad(lng1) - rad(lng2);

double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +

Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));

s = s * EARTH_RADIUS;

s = Math.Round(s * 10000) / 10000;

return s;

}

android 百度定位 封装,百度定位SDK使用V4.0相关推荐

  1. play-services-tasks (com.google.android.gms:play-services-tasks)”的开发者向 SDK 版本 18.0.0

    "play-services-tasks (com.google.android.gms:play-services-tasks)"的开发者向 SDK 版本 18.0.0 添加了以 ...

  2. Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍

    ***转载.引用请标明出处*** http://www.jianshu.com/p/29ccac3e1e42 本文出自[zhh_happig的简书博客](http://www.jianshu.com/ ...

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

    from: http://blog.csdn.net/y1scp/article/details/49095729 定位+移动选址 百学须先立志-学前须知: 我们经常在各大主流APP上要求被写上地址, ...

  4. Android定位,百度SDK,百度定位

    百度地图定位SDK提供了GPS.基站.WiFi.地磁.蓝牙.传感器等多种定位方式,适用于室内.室外多种定位场景,定位精度高.覆盖率广.网络定位请求流量小.定位速度快: 官方API:Android定位S ...

  5. Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?

    1. 背景 小组在一个Demo项目中,图省事准备使用官方的GPS定位API. 但在我的印象中,官方的定位API是不好用的,一般都是用 高德地图/百度地图 的定位SDK的. 使用官方的定位API获取定位 ...

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

    这几天的项目不是非常紧.于是想为未来可能要做的项目做一些技术储备. 下一个项目非常有可能是定位开发,须要用到手机定位功能,于是查了查如今比較流行的第三方定位,最火的基本上就是百度定位>高德定位& ...

  7. [android] 百度地图开发 (二).定位城市位置和城市POI搜索

    一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位 ...

  8. android百度导航实现,Android 集成百度地图实现设备定位

    Android 集成百度地图实现设备定位 步骤1: 申请android 端SDK : http://lbsyun.baidu.com/ 步骤2: 下载基础版SDK 步骤3: 下载示例程序 步骤4: 开 ...

  9. 百度android定位 602 key mcode不匹配,我的Android进阶之旅------百度地图学习:BDLocation.getLocType ( )值分析...

    BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取.通过该类用户可以获取error code,位置的坐标,精度半径等信息.具体方法 ...

最新文章

  1. 使用idea 时出现classnotfound
  2. 论文笔记:MobileFaceNet
  3. SSL/TSL双向认证过程与Wireshark抓包分析
  4. webplugin 没有画面_[问题记录] webpack devServer HtmlWebpackPlugin 没有加载 js、css
  5. 阿里云RPA专有云产品文档集合
  6. python实现决策树归纳_决策树【python实现】
  7. Java 设计模式之 Observer 模式
  8. JAVA引用类型在变量槽,浅析Java的内存模型
  9. 职场上有3种类型的人,最后一种类型老板最喜欢,你是哪一类?
  10. 点至直线的距离和垂足点计算
  11. indesign使用教程,如何将图形添加到项目?
  12. 神经网络激活函数优缺点和比较(sigmod,tanh,relu,softmax,leaky relu,ELU,SELU)
  13. Java项目 yaml明文密码加密
  14. ESXI安装以及重新安装
  15. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  16. 强烈推荐纪录片——《互联网之子》
  17. 【论文翻译和解释(2)】LOF:Identifying Density-Based Local Outliers论文精读
  18. cv2颜色空间(2)——交互式的颜色检测
  19. 新媒体如何借势进行热点营销
  20. zip4j对处理压缩包及压缩包加密处理

热门文章

  1. UninstallPKG for Mac(PKG文件卸载)
  2. flash 的鼠标事件详解
  3. 浏览器兼容性总结: IE 火狐 谷歌 360 搜狗
  4. AMS5601开发 AB角度磁编码器
  5. 用程序阻止计算机睡眠,PreventTurnOff防止电脑休眠工具|win10电脑防止屏幕休眠软件_最火软件站...
  6. [区间dp]涂色 洛谷P4170
  7. 【数据结构与算法】单链表的插入和删除
  8. 如何查已经欠费的联通手机号码
  9. Excel表格怎么快速计算出算式结果
  10. java中用于定义小数的关键字_Java 中用于定义小数的关键字有两个:( ) 和 ( )。_学小易找答案...