首页 > 代码库 > 百度Android定位SDK4.2

百度Android定位SDK4.2

项目最近要把定位服务独立出来,所以顺便把定位服务升级到4.2最新版。以下记录一个简单的定位服务的实现(基于百度Android定位4.2版本)
1:首先到百度LBS平台申请密钥
地址是:http://developer.baidu.com/map/index.php
申请密钥需要安全码:你的Eclipse SHA1指纹(Preferences->Android->Build)+分号+应用程序包名
例如:
FS:54:EB:47:23:F6:70:FD:DD:GF:53:FS:10:1F:1A:54:00:5E:C0:24;com.example.testandroid
2:下载并添加百度定位的jar、so文件
网址:http://developer.baidu.com/map/index.php?title=android-locsdk/geosdk-android-download
locSDK_4.2.jar添加到libs包下,另外,libs目录下新建目录armeabi,并把liblocSDK4d.so文件复制其中
3:配置AndroidManifest.xml文件

声明使用权限

 1 <!-- 这个权限用于进行网络定位--> 2 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> 3 <!-- 这个权限用于访问GPS定位--> 4 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 5 <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> 6 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 7 <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> 8 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 9 <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->10 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>11 <!-- 用于读取手机当前的状态-->12 <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>13 <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->14 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>15 <!-- 访问网络,网络定位需要上网-->16 <uses-permission android:name="android.permission.INTERNET" />17 <!—SD卡读取权限,用户写入离线定位数据-->18 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>19 <!--允许应用读取低级别的系统日志文件 -->20 <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

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

1 <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">2 </service>

设置AcessKey

1 <meta-data2             android:name="com.baidu.lbsapi.API_KEY"3             android:value="key" />//key:开发者申请的key

例如,我的AndroidManifest.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3     package="com.example.testandroid" 4     android:versionCode="1" 5     android:versionName="1.0" > 6  7     <uses-sdk 8         android:minSdkVersion="8" 9         android:targetSdkVersion="19" />10 11     <!-- 这个权限用于进行网络定位 -->12     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >13     </uses-permission>14     <!-- 这个权限用于访问GPS定位 -->15     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >16     </uses-permission>17     <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->18     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >19     </uses-permission>20     <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->21     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >22     </uses-permission>23     <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->24     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >25     </uses-permission>26     <!-- 用于读取手机当前的状态 -->27     <uses-permission android:name="android.permission.READ_PHONE_STATE" >28     </uses-permission>29     <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->30     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >31     </uses-permission>32     <!-- 访问网络,网络定位需要上网 -->33     <uses-permission android:name="android.permission.INTERNET" />34     <!-- SD卡读取权限,用户写入离线定位数据 -->35     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >36     </uses-permission>37     <!-- 允许应用读取低级别的系统日志文件 -->38     <uses-permission android:name="android.permission.READ_LOGS" >39     </uses-permission>40 41     <application42         android:allowBackup="true"43         android:icon="@drawable/ic_launcher"44         android:label="@string/app_name"45         android:theme="@style/AppTheme" >46         <activity47             android:name="com.example.testandroid.ui.LocationActivity"48             android:label="@string/app_name" >49             <intent-filter>50                 <action android:name="android.intent.action.MAIN" />51 52                 <category android:name="android.intent.category.LAUNCHER" />53             </intent-filter>54         </activity>55 56         <service57             android:name="com.baidu.location.f"58             android:enabled="true"59             android:process=":remote" >60             <intent-filter>61                 <action android:name="com.baidu.location.service_v2.2" >62                 </action>63             </intent-filter>64         </service>65         <!-- meta-data需要写在application中 -->66         <meta-data67             android:name="com.baidu.lbsapi.API_KEY"68             android:value="your key" /><!-- 这里的Key需要改成你申请的Key -->69     </application>70 71 </manifest>

测试应用中,只有一个Activity:

  1 package com.example.testandroid.ui;  2   3 import android.os.Bundle;  4 import android.support.v7.app.ActionBarActivity;  5 import android.view.View;  6 import android.widget.Button;  7 import android.widget.TextView;  8   9 import com.baidu.location.BDLocation; 10 import com.baidu.location.BDLocationListener; 11 import com.baidu.location.LocationClient; 12 import com.baidu.location.LocationClientOption; 13 import com.baidu.location.LocationClientOption.LocationMode; 14 import com.example.testandroid.R; 15  16 public class LocationActivity extends ActionBarActivity { 17  18     private TextView location_tv1; 19     private Button startLocation; 20     private boolean isStart = false; 21     public LocationClient mLocationClient; 22     public MyLocationListener mMyLocationListener; 23     private long times = 0; 24  25     @Override 26     protected void onCreate(Bundle savedInstanceState) { 27         super.onCreate(savedInstanceState); 28         setContentView(R.layout.activity_location); 29         initView(); 30         init(); 31     } 32  33     private void initView() { 34         location_tv1 = (TextView) findViewById(R.id.location_tv1); 35         startLocation = (Button) findViewById(R.id.startLocation); 36         startLocation.setOnClickListener(new View.OnClickListener() { 37  38             @Override 39             public void onClick(View v) { 40                 ctlLocService(); 41             } 42         }); 43     } 44  45     /** 46      *  47      * @Title: init  48      * @Description: 初始化相关服务及监听 49      * @return void 50      * @throws  51      * @author creasylai19@gmail.com 52      */ 53     private void init() { 54         mLocationClient = new LocationClient(this.getApplicationContext()); 55         mMyLocationListener = new MyLocationListener(); 56         mLocationClient.registerLocationListener(mMyLocationListener); 57         InitLocation(); 58     } 59  60     /** 61      *  62      * @Title: ctlLocService  63      * @Description: 控制定位服务的开关 64      * @return void 65      * @throws  66      * @author creasylai19@gmail.com 67      */ 68     private void ctlLocService() { 69         if (!isStart) { 70             isStart = true; 71             mLocationClient.start(); 72             startLocation.setText("停止定位"); 73         } else { 74             isStart = false; 75             mLocationClient.stop(); 76             startLocation.setText("启动定位"); 77         } 78     } 79  80     private void InitLocation() { 81         LocationClientOption option = new LocationClientOption(); 82         option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式 83         /** 84          * 返回国测局经纬度坐标系 coor=gcj02 85          * 返回百度墨卡托坐标系 coor=bd09 86          * 返回百度经纬度坐标系 coor=bd09ll 87          */ 88         option.setCoorType("bd09ll");// 百度手机地图对外接口中的坐标系默认是bd09ll,如果配合百度地图产品的话,需要注意坐标系对应问题 89         /** 90          * 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation() 91          * 后,每隔设定的时间,定位SDK就会进行一次定位。 92          * 如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果; 93          * 如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。定时定位时,调用一次requestLocation,会定时监听到定位结果。 94          *  95          * 当不设此项,或者所设的整数值小于1000(ms)时,采用一次定位模式。每调用一次requestLocation(), 96          * 定位SDK会发起一次定位。请求定位与监听结果一一对应。 97          *  98          * 设定了定时定位后,可以热切换成一次定位,需要重新设置时间间隔小于1000(ms)即可。locationClient对象stop后,将不再进行定位 99          * 。 如果设定了定时定位模式后,多次调用requestLocation(),则是每隔一段时间进行一次定位,同时额外的定位请求也会进行定位,100          * 但频率不会超过1秒一次。101          */102         option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms103         option.setIsNeedAddress(true); // 返回的定位结果包含地址信息104         option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向105         option.setOpenGps(true); // 打开GPS106         // String 值为all时,表示返回地址信息,其他值都表示不返回地址信息(官方指南说有这个方法,但类中却没有,不知道为什么)107         // option.setAddrType("all");108         option.setProdName("com.example.textandroid"); // 设置产品线名称,百度建议109         mLocationClient.setLocOption(option);110     }111 112     protected void onStop() {113         mLocationClient.stop();114         super.onStop();115     }116 117     public class MyLocationListener implements BDLocationListener {118 119         @Override120         public void onReceiveLocation(BDLocation location) {121             StringBuffer sb = new StringBuffer(256);122             sb.append("第" + (++times) + "获取定位");123             sb.append("\ntime : ");124             sb.append(location.getTime());125             sb.append("\nerror code : ");126             sb.append(location.getLocType());127             sb.append("\nlatitude : ");128             sb.append(location.getLatitude());129             sb.append("\nlontitude : ");130             sb.append(location.getLongitude());131             sb.append("\nradius : ");132             sb.append(location.getRadius());133             if (location.getLocType() == BDLocation.TypeGpsLocation) {134                 sb.append("\nspeed : ");135                 sb.append(location.getSpeed());136                 sb.append("\nsatellite : ");137                 sb.append(location.getSatelliteNumber());138                 sb.append("\ndirection : ");139                 sb.append("\naddr : ");140                 sb.append(location.getAddrStr());141                 sb.append(location.getDirection());142             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {143                 sb.append("\naddr : ");144                 sb.append(location.getAddrStr());145                 // 运营商信息146                 sb.append("\noperationers : ");147                 sb.append(location.getOperators());148             }149             location_tv1.setText(sb.toString());150         }151 152     }153 }

相应的layout文件如下:

 1 <LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 6     android:paddingRight="@dimen/activity_horizontal_margin" 7     tools:context="com.example.testandroid.ui.LocationActivity" 8     android:orientation="vertical" > 9 10     <TextView11         android:id="@+id/location_tv1"12         android:layout_width="match_parent"13         android:layout_height="0dp"14         android:layout_weight="1"15         android:text="@string/hello_world" />16 17     <Button18         android:id="@+id/startLocation"19         android:layout_width="match_parent"20         android:layout_height="wrap_content"21         android:layout_gravity="bottom"22         android:text="启动定位" />23 24 </LinearLayout>

运行应用,得到的运行结果的一个截屏如下:

其实,这些调用第三方接口,参考指南直接看官方文档最好,百度定位的官网指南(不过这个指南有不少错误的,有些指导还是以前老版本的,没有做好更新):
http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v4-2