百度定位SDK使用V4.0
2015-07-31 18:27
555 查看
前言:最近在做一个应用,要用到LBS定位,本想自己写,可技术还是不到位,而且时间也不多了,还是以先实现为主吧,然后就研究百度的LBS定位,谷歌的也有LBS定位服务,但总感觉谷歌大神被赶到香港以后,就一直不稳定,不知道LBS怎么样,估计也不行,所以直接就用了百度定位SDK,但百度的定位SDK每日的最大访问量为10W,所以软件用户量大了的话,还是自己写定位代码吧,像我这样的前期用用也还无所谓,毕竟前期用户量不可能这么大的。
相关说明:
根据《百度定位SDK开发指南》,其中说到在V4.0以后都要申请KEY,但现在的KEY申请已经相当复杂了,变成了根应用相关的,奶奶个熊,我琢磨了好久也不知道申请的对不对,但我在程序中把KEY去掉,仍然是可以定位的,真不知道这是需要KEY还是不需要KEY。《指南》中说,地图初始化时用到KEY,可能这也说明在纯定位时,是不需要KEY的。既然不需要KEY,那么也就无法限定使用次数了。哈哈,好像我发现了什么。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
既然不需要KEY,但源码是又要添加上SetKey()这句,而且论坛中很多人说设置KEY错误的问题(http://bbs.lbsyun.baidu.com/viewthread.php?tid=2859&extra=page%3D1),我这运行机成功的很不踏实啊。=_=!!
《android使用百度定位SDK方法及错误处理》:http://mobile.51cto.com/aprogram-376690.htm (这篇文章不错,将定位的接口封装成了一个类,直接调用就可以了)
《我的程序为什么不能定位》:http://bbs.lbsyun.baidu.com/viewthread.php?tid=557&extra=page%3D1
![](http://img.blog.csdn.net/20131228162227281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFydmljODgwOTI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
view plaincopyprint?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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" >
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#ff00ff" >
</TextView>
<Button
android:id="@+id/ReLBS_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textview"
android:text="重新定位"/>
</RelativeLayout>
view plaincopyprint?
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,可见程序定位了多少次!!!!!
![](http://img.blog.csdn.net/20131228164705953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFydmljODgwOTI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
不知道怎么回事,刚才大约有一个小时定位都不成功,又返回errorCode:0;然后过了一段时间,自己又成功了,而且论坛里说有时定位准,有时定位不准,MY GOD,这百度到底行不行啊。这样时好时坏,搞得很不踏实啊。
附上errorCode值的含义吧,找了半天还是在论坛里找到的,使用说明中,根本没讲,哎,中国这些帮助文档啊,无语啦!!
百度基站定位错误返回码
61 : GPS定位结果
62 : 扫描整合定位依据失败。此时定位结果无效。
63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
68 : 网络连接失败时,查找本地离线定位时对应的返回结果
161: 表示网络定位结果
162~167: 服务端定位失败。
上源码吧:http://download.csdn.net/detail/harvic880925/6781711(不要分,紧供分享)
公式:(http://xxyyyboy.blog.163.com/blog/static/765832620110410457662/)
![](http://img.blog.csdn.net/20131230090542453)
(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里面提取了计算代码,有验证的说是正确的,反正我是不会算的了,我的软件中也是用这段代码,如下
[java]
view plaincopyprint?
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;
}
转载请标明出处,谢谢,/article/2593979.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关说明:
根据《百度定位SDK开发指南》,其中说到在V4.0以后都要申请KEY,但现在的KEY申请已经相当复杂了,变成了根应用相关的,奶奶个熊,我琢磨了好久也不知道申请的对不对,但我在程序中把KEY去掉,仍然是可以定位的,真不知道这是需要KEY还是不需要KEY。《指南》中说,地图初始化时用到KEY,可能这也说明在纯定位时,是不需要KEY的。既然不需要KEY,那么也就无法限定使用次数了。哈哈,好像我发现了什么。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
既然不需要KEY,但源码是又要添加上SetKey()这句,而且论坛中很多人说设置KEY错误的问题(http://bbs.lbsyun.baidu.com/viewthread.php?tid=2859&extra=page%3D1),我这运行机成功的很不踏实啊。=_=!!
一、相关资料
《百度定位SDK开发指南》:http://developer.baidu.com/map/geosdk-android-developv4.0.htm《android使用百度定位SDK方法及错误处理》:http://mobile.51cto.com/aprogram-376690.htm (这篇文章不错,将定位的接口封装成了一个类,直接调用就可以了)
《我的程序为什么不能定位》:http://bbs.lbsyun.baidu.com/viewthread.php?tid=557&extra=page%3D1
二、实现定位
效果图: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
<ol style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><service</span> <span class="re0">android:name</span>=<span class="st0">"com.baidu.location.f"</span> <span class="re0">android:enabled</span>=<span class="st0">"true"</span> <span class="re0">android:process</span>=<span class="st0">":remote"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></service<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li></ol>
2.2 声明使用权限
<ol style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.ACCESS_COARSE_LOCATION"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.ACCESS_FINE_LOCATION"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.ACCESS_WIFI_STATE"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.ACCESS_NETWORK_STATE"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.CHANGE_WIFI_STATE"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.READ_PHONE_STATE"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.WRITE_EXTERNAL_STORAGE"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.INTERNET"</span> <span class="re2" style="color:#000000;FONT-WEIGHT: bold">/></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li><li style="PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; VERTICAL-ALIGN: top; FONT-WEIGHT: normal; PADDING-TOP: 0px" class="li1"><div class="de1"><span class="sc3"><span class="re1" style="color:#000000;FONT-WEIGHT: bold"><uses-permission</span> <span class="re0">android:name</span>=<span class="st0">"android.permission.READ_LOGS"</span><span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span><span class="re1" style="color:#000000;FONT-WEIGHT: bold"></uses-permission<span class="re2" style="color:#000000;FONT-WEIGHT: bold">></span></span></span></div></li></ol>
3、XML内容
[html]view plaincopyprint?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
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" >
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#ff00ff" >
</TextView>
<Button
android:id="@+id/ReLBS_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textview"
android:text="重新定位"/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 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" > <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#ff00ff" > </TextView> <Button android:id="@+id/ReLBS_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/textview" android:text="重新定位"/> </RelativeLayout>
4、J***A页面
[java]view plaincopyprint?
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;
}
}
}
}
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: 服务端定位失败。
上源码吧:http://download.csdn.net/detail/harvic880925/6781711(不要分,紧供分享)
三、由经纬度计算两点间的距离
这种公式我当然是不知道的,百度下,代码公式啥啥的都有,直接用就OK,至于正确性嘛,应该是对的吧,这里记录一下公式:(http://xxyyyboy.blog.163.com/blog/static/765832620110410457662/)
(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里面提取了计算代码,有验证的说是正确的,反正我是不会算的了,我的软件中也是用这段代码,如下
[java]
view plaincopyprint?
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;
}
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获取经纬度、计算距离、方位角》http://www.cnblogs.com/ouling/archive/2011/08/26/2154555.html
转载请标明出处,谢谢,/article/2593979.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- LayoutInflater的使用与说明
- WebLogic Server 管理
- Jenkins、Git、CocoaPods、Fir.im 实现 iOS 应用持续集成
- NSMutableDictionary(可变字典)
- Linux vmstat命令实战详解
- gstreamer插件工作原理与流程分析
- 【Unity3D ugui】使用艺术字
- Docker的安装
- 闪回(关于闪回表)
- EL和OGNL (转)
- linux认证
- 3021: Supermarket
- NSDictionary /NSMutableDictionary
- UVA1625 Color Length(附 刘汝佳代码)
- 我排第几个(康托展开)
- 结合php ob函数理解缓冲机制
- 鸟哥私房菜学习笔记六 Bash
- 使用命令npm install -g hexo-cli 安装Hexo报错问题
- NSMutableArray(可变数组)
- 使用命令npm install -g hexo-cli 安装Hexo报错问题