项目最近要把定位服务独立出来,所以顺便把定位服务升级到4.2最新版。以下记录一个简单的定位服务的实现(基于百度Android定位4.2版本)
1:首先到百度LBS平台申请密钥
申请密钥需要安全码:你的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文件
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-data 2 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 <application 42 android:allowBackup="true" 43 android:icon="@drawable/ic_launcher" 44 android:label="@string/app_name" 45 android:theme="@style/AppTheme" > 46 <activity 47 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 <service 57 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-data 67 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);// 设置发起定位请求的间隔时间为5000ms
103 option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
104 option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向
105 option.setOpenGps(true); // 打开GPS
106 // 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 @Override
120 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 <TextView 11 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 <Button 18 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>
运行应用,得到的运行结果的一个截屏如下:

其实,这些调用第三方接口,参考指南直接看官方文档最好,百度定位的官网指南(不过这个指南有不少错误的,有些指导还是以前老版本的,没有做好更新):
来源:https://www.cnblogs.com/creasylai19/p/3913910.html