现在很多app都会自动定位当前位置,比如团购网站、招聘网站、天气app等等。定位可以使用GPS、基站、Wi-Fi来完成定位,百度地图Android定位SDK是利用设备当前的GPS信息(GPS定位),基站信息(基站定位)和Wi-Fi信息(Wi-Fi定位)完成定位的。开发者在应用中成功集成百度定位SDK以后,既可以方便的通过定位SDK的接口向百度定位服务请求位置信息。

定位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();@Overrideprotected 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.0mLocationClient.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);}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();mLocationClient.stop();// 停止定位}/** * 设置相关参数 */private void setLocationOption() {LocationClientOption option = new LocationClientOption();option.setOpenGps(true);option.setIsNeedAddress(true);// 返回的定位结果包含地址信息option.setAddrType("all");// 返回的定位结果包含地址信息option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000msoption.disableCache(true);// 禁止启用缓存定位option.setPoiNumber(5); // 最多返回POI个数option.setPoiDistance(1000); // poi查询距离option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息mLocationClient.setLocOption(option);}public class MyLocationListener implements BDLocationListener {@Overridepublic 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());}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.btn_request:if (mLocationClient != null && mLocationClient.isStarted())mLocationClient.requestLocation();elseLog.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

需要说明的是我这里到的是V4.1版本,在V4.1版本中必须设置AK,要不会提示空指针异常,在V4.0中可以不设置AK都能定位,但还不清楚有没有其它隐患,V4.1在代码中设置AK的函数为setAccessKey,V4.0设置AK的函数为setAK

还有网页的文档一直没有调用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());



更多相关文章

  1. 六大布局之非常用布局
  2. 优化Android(安卓)App启动白屏
  3. Android与电脑局域网共享之:Samba Server
  4. 如何分析和研究Log文件(转)
  5. Android(安卓)设置页面的设计
  6. 最全面的AndroidStudio配置指南总结-包括护眼模式
  7. 一文学会所有 Android(安卓)TextView 属性,妈妈再也不担心我的代
  8. 移动端键盘弹起引起的fixed定位问题
  9. android Button设置text属性为字母时,字母自动变成大写

随机推荐

  1. android调用浏览器打开网页链接
  2. Eclipse配置Android开发环境
  3. Android Failed to allocate memory: 145
  4. android 打开各种文件的方式
  5. MediaExtractor的seekTo方法精确定位到指
  6. Android 手写和笔锋研究资料
  7. 安卓学习之--UI控件用法 单选 按钮 下拉
  8. android 修改系统显示u盘的名称
  9. android:Handler MessageQueue Looper分析
  10. Android Widget 小部件(四---完结) 使用L