百度定位SDK使用V4.0

本文介绍了如何在Android应用中集成并使用百度定位SDK,包括关键配置、代码实现及定位原理,同时分享了如何通过经纬度计算两点间距离的方法,并提供了相关代码实现。此外,还讨论了SDK使用过程中遇到的问题及解决策略。

 前言:最近在做一个应用,要用到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),我这运行机成功的很不踏实啊。=_=!!

一、相关资料

百度定位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内容

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity" >  
  10.       
  11.     <TextView  
  12.         android:id="@+id/textview"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:textColor="#ff00ff" >  
  16.     </TextView>  
  17.   
  18.     <Button   
  19.         android:id="@+id/ReLBS_button"  
  20.         android:layout_width="fill_parent"  
  21.         android:layout_height="wrap_content"  
  22.         android:layout_below="@+id/textview"  
  23.         android:text="重新定位"/>  
  24.   
  25. </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、JAVA页面

  1. package com.example.try_lbs_baidu;  
  2.   
  3. /** 
  4.  * 尝试百度定位SDK 
  5.  * @author harvic 
  6.  * @date 2013-12-28 
  7.  */  
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13. import android.widget.Button;  
  14. import android.widget.TextView;  
  15.   
  16. import com.baidu.location.BDLocation;  
  17. import com.baidu.location.BDLocationListener;  
  18. import com.baidu.location.LocationClient;  
  19. import com.baidu.location.LocationClientOption;  
  20.   
  21. public class MainActivity extends Activity {  
  22.     private TextView mTv = null;  
  23.     public LocationClient mLocationClient = null;  
  24.     public MyLocationListenner myListener = new MyLocationListenner();  
  25.     public Button ReLBSButton=null;  
  26.     public static String TAG = "msg";  
  27.   
  28.   
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.           
  34.         mTv = (TextView)findViewById(R.id.textview);  
  35.         ReLBSButton=(Button)findViewById(R.id.ReLBS_button);  
  36.           
  37.         mLocationClient = new LocationClient( this );  
  38.   
  39.         /**—————————————————————————————————————————————————————————————————— 
  40.          * 这里的AK和应用签名包名绑定,如果使用在自己的工程中需要替换为自己申请的Key 
  41.          * —————————————————————————————————————————————————————————————————— 
  42.          */  
  43. //      mLocationClient.setAK("697f50541f8d4779124896681cb6584d");      
  44. //      mLocationClient.setAK("z4nqERrqxnhNzT5VOGNVRt80");   
  45.         mLocationClient.registerLocationListener( myListener );  
  46.   
  47.         setLocationOption();//设定定位参数   
  48.           
  49.         mLocationClient.start();//开始定位   
  50.           
  51.         // 重新定位   
  52.         ReLBSButton.setOnClickListener(new Button.OnClickListener() {  
  53.             public void onClick(View v) {  
  54.                 // TODO Auto-generated method stub   
  55.                 if (mLocationClient != null && mLocationClient.isStarted())  
  56.                     mLocationClient.requestLocation();  
  57.                 else  
  58.                     Log.d("msg""locClient is null or not started");  
  59.             }  
  60.         });  
  61.           
  62.     }   
  63.       
  64.     //设置相关参数   
  65.     private void setLocationOption(){  
  66.         LocationClientOption option = new LocationClientOption();  
  67.         option.setOpenGps(true);  
  68.         option.setAddrType("all");//返回的定位结果包含地址信息   
  69.         option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02   
  70.         option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms   
  71.         option.disableCache(true);//禁止启用缓存定位   
  72.         option.setPoiNumber(5);    //最多返回POI个数      
  73.         option.setPoiDistance(1000); //poi查询距离           
  74.         option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息           
  75.         mLocationClient.setLocOption(option);  
  76.           
  77.     }   
  78.   
  79.     @Override  
  80.     public void onDestroy() {  
  81.         mLocationClient.stop();//停止定位   
  82.         mTv = null;  
  83.         super.onDestroy();  
  84.     }  
  85.   
  86.   
  87.     /** 
  88.      * 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中 
  89.      */  
  90.     public class MyLocationListenner implements BDLocationListener {  
  91.         @Override  
  92.         //接收位置信息   
  93.         public void onReceiveLocation(BDLocation location) {  
  94.             if (location == null)  
  95.                 return ;  
  96.             StringBuffer sb = new StringBuffer(256);  
  97.             sb.append("time : ");  
  98.             sb.append(location.getTime());  
  99.             sb.append("\nreturn code : ");  
  100.             sb.append(location.getLocType());  
  101.             sb.append("\nlatitude : ");  
  102.             sb.append(location.getLatitude());  
  103.             sb.append("\nlontitude : ");  
  104.             sb.append(location.getLongitude());  
  105.             sb.append("\nradius : ");  
  106.             sb.append(location.getRadius());  
  107.             if (location.getLocType() == BDLocation.TypeGpsLocation){  
  108.                 sb.append("\nspeed : ");  
  109.                 sb.append(location.getSpeed());  
  110.                 sb.append("\nsatellite : ");  
  111.                 sb.append(location.getSatelliteNumber());  
  112.             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){  
  113.                 /** 
  114.                  * 格式化显示地址信息 
  115.                  */  
  116.                 sb.append("\naddr : ");  
  117.                 sb.append(location.getAddrStr());  
  118.             }  
  119.             sb.append("\nsdk version : ");  
  120.             sb.append(mLocationClient.getVersion());  
  121.             sb.append("\nisCellChangeFlag : ");  
  122.             sb.append(location.isCellChangeFlag());  
  123.             mTv.setText(sb.toString());  
  124.             Log.i(TAG, sb.toString());  
  125.         }  
  126.         //接收POI信息函数,我不需要POI,所以我没有做处理   
  127.         public void onReceivePoi(BDLocation poiLocation) {  
  128.             if (poiLocation == null) {  
  129.                 return;  
  130.             }  
  131.         }  
  132.     }  
  133.   
  134.   
  135. }  
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.youkuaiyun.com/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里面提取了计算代码,有验证的说是正确的,反正我是不会算的了,我的软件中也是用这段代码,如下

  1. private const double EARTH_RADIUS = 6378.137;  
  2. private static double rad(double d)  
  3. {  
  4.    return d * Math.PI / 180.0;  
  5. }  
  6.   
  7. public static double GetDistance(double lat1, double lng1, double lat2, double lng2)  
  8. {  
  9.    double radLat1 = rad(lat1);  
  10.    double radLat2 = rad(lat2);  
  11.    double a = radLat1 - radLat2;  
  12.    double b = rad(lng1) - rad(lng2);  
  13.    double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +   
  14.     Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));  
  15.    s = s * EARTH_RADIUS;  
  16.    s = Math.Round(s * 10000) / 10000;  
  17.    return s;  
  18. }  
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


转载请标明出处,谢谢,http://blog.youkuaiyun.com/harvic880925/article/details/17633311

版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值