定位SDK会根据设备当前的实际情况(如是否开启GPS,是否连接网络,是否扫描到Wi-Fi信息等)生成定位依据,并根据开发者设置的实际定位策略(包括三种:高精度模式,低功耗模式,仅用设备模式)进行定位。
关于百度SDK更详细的定位原理可以参考百度的文档:http://developer.baidu.com/map/geosdk.htm
什么是LBS可以参考:http://baike.baidu.com/link?url=QyoQddAxcacf6YHoPhxNK8omWn3HxZyG3Hm5Wf1--36T5bT2lRoYBo7-JIpLRESoMgx8hZqeqbUyED0kHp6_3rwi2H7GAjyDoPhdu5mig5iyNbtPTNLvCCTlSXecyG-a
要使用百度定位SDK首先要注册成为开发者:http://developer.baidu.com/map/
下载定位SDK
申请密钥 按照http://developer.baidu.com/map/geosdk-android-key.htm上的说明去做就OK了
我得到的密钥是
前面的条件都具备了就是新建工程,导入SDK
目录结构
定位后的效果
程序配置文件AndroidManifest.xml定义权限和声明服务,这些都可以在百度的文档中找到
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dzt.weather" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <!-- 用于读取手机当前的状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <!-- 访问网络,网络定位需要上网 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡读取权限,用户写入离线定位数据 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" > </uses-permission> <!-- 允许应用读取低级别的系统日志文件 --> <uses-permission android:name="android.permission.READ_LOGS" > </uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="8mrnaFzKu3DoduLnWuB5Lt2w" /> <activity android:name="com.dzt.weather.WeatherActivity" android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>其中
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="8mrnaFzKu3DoduLnWuB5Lt2w" />
的value是你申请的AK,可以在代码中设置也可以在清单文件中设置,代码设置如下
mLocationClient.setAccessKey("8mrnaFzKu3DoduLnWuB5Lt2w"); //V4.1
Activity中的代码
package com.dzt.weather; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * 百度基站定位错误返回码 */ // 61 : GPS定位结果 // 62 : 扫描整合定位依据失败。此时定位结果无效。 // 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。 // 65 : 定位缓存的结果。 // 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果 // 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果 // 68 : 网络连接失败时,查找本地离线定位时对应的返回结果 // 161: 表示网络定位结果 // 162~167: 服务端定位失败 // 502:KEY参数错误 // 505:KEY不存在或者非法 // 601:KEY服务被开发者自己禁用 // 602: KEY Mcode不匹配,意思就是您的ak配置过程中安全码设置有问题,请确保: sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名 // 501-700:KEY验证失败 public class WeatherActivity extends Activity implements OnClickListener { private static final String TAG = "dzt"; private TextView mText; private TextView mTextPoi; private LocationClient mLocationClient = null; private BDLocationListener myListener = new MyLocationListener(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_weather); mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类 // mLocationClient.setAccessKey("8mrnaFzKu3DoduLnWuB5Lt2w"); //V4.1 // mLocationClient.setAK("8mrnaFzKu3DoduLnWuB5Lt2w"); //V4.0 mLocationClient.registerLocationListener(myListener); // 注册监听函数 setLocationOption(); mLocationClient.start();// 开始定位 initWidgets(); } private void initWidgets() { mText = (TextView) findViewById(R.id.tv_text); mTextPoi = (TextView) findViewById(R.id.tv_text_poi); Button btn = (Button) findViewById(R.id.btn_request); btn.setOnClickListener(this); btn = (Button) findViewById(R.id.btn_request_poi); btn.setOnClickListener(this); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mLocationClient.stop();// 停止定位 } /** * 设置相关参数 */ private void setLocationOption() { LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setIsNeedAddress(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); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return; StringBuffer sb = new StringBuffer(256); sb.append("当前时间 : "); sb.append(location.getTime()); sb.append("\n错误码 : "); sb.append(location.getLocType()); sb.append("\n纬度 : "); sb.append(location.getLatitude()); sb.append("\n经度 : "); sb.append(location.getLongitude()); sb.append("\n半径 : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) { sb.append("\n速度 : "); sb.append(location.getSpeed()); sb.append("\n卫星数 : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\n地址 : "); sb.append(location.getAddrStr()); } mText.setText(sb.toString()); Log.d(TAG, "onReceiveLocation " + sb.toString()); } public void onReceivePoi(BDLocation poiLocation) { // 将在下个版本中去除poi功能 if (poiLocation == null) { return; } StringBuffer sb = new StringBuffer(256); sb.append("Poi time : "); sb.append(poiLocation.getTime()); sb.append("\nerror code : "); sb.append(poiLocation.getLocType()); sb.append("\nlatitude : "); sb.append(poiLocation.getLatitude()); sb.append("\nlontitude : "); sb.append(poiLocation.getLongitude()); sb.append("\nradius : "); sb.append(poiLocation.getRadius()); if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\naddr : "); sb.append(poiLocation.getAddrStr()); } if (poiLocation.hasPoi()) { sb.append("\nPoi:"); sb.append(poiLocation.getPoi()); } else { sb.append("noPoi information"); } mTextPoi.setText(sb.toString()); Log.d(TAG, "onReceivePoi " + sb.toString()); } } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_request: if (mLocationClient != null && mLocationClient.isStarted()) mLocationClient.requestLocation(); else Log.d(TAG, "locClient is null or not started"); break; case R.id.btn_request_poi: // 请求POI数据 if (mLocationClient != null && mLocationClient.isStarted()) mLocationClient.requestPoi(); break; default: break; } } }完整Demo http://download.csdn.net/detail/deng0zhaotai/7177379
还有网页的文档一直没有调用mLocationClient.start();// 开始定位,如果没有调用是定不了位的,百度网页文档还有很多不准确的地方,在使用时一定要注意。
也可以单独获取省或市
sb.append("\n省份 : "); sb.append(location.getProvince()); sb.append("\n城市 : "); sb.append(location.getCity()); sb.append("\n区/县 : "); sb.append(location.getDistrict()); sb.append("\n街道: "); sb.append(location.getStreet()); sb.append("\n街道号码: "); sb.append(location.getStreetNumber()); sb.append("\n地址 : "); sb.append(location.getAddrStr());