百度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-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 [email protected]
 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 [email protected]
 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>

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

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

http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v4-2

百度Android定位SDK4.2

时间: 2024-08-05 11:18:41

百度Android定位SDK4.2的相关文章

发现最新版百度Android 定位SDK v6.1.3 网络定位bug

对于百度地图已经实在忍无可忍了,实验室两年以前的一个项目用到了百度地图,以前师兄毕业了,我来维护这个破项目,百度地图推出新版本出来后,老版本的api不能用了,你就不能做到向下兼容吗?换掉少量的api也就算了,居然整体风格都换了,大爷的,我得先学老版本的api看懂师兄留下的代码,再学新版本的api修改这个项目,这也没啥,然而你新版本官方demo怎么还留bug!!折腾一天后发现,这是百度Android 定位SDK的bug,不是我自己的代码的问题的感觉很奇妙有木有!!! 使用百度官网提供的demo学习

百度地图定位原理

定位我们使用的是百度 Android 定位SDKv4.0,我们先了解下定位原理和定位精度 定位原理 使用百度Android定位SDK必须注册GPS和网络使用权限.定位SDK采用GPS.基站.Wi-Fi信号进行定位.当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS.基站.Wi-Fi信号)的实际情况(如是否开启GPS.是否连接网络.是否有信号等)来生成相应定位依据进行定位. 用户可以设置满足自身需求的定位依据: 若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定

cordova开发中,android端利用百度sdk定位。

原文在此,感谢作者http://snoopyxdy.blog.163.com/blog/static/601174402014420872345/ 近期的一个phonegap项目把我做的焦头烂额,最让人蛋疼的就是安卓4.1.x对html5的定位获取经纬度有个无比巨大的坑,一般我们利用如下代码进行html5的定位 navigator.geolocation.getCurrentPosition(function(pos){               alert(JSON.stringify(po

cordova百度地图定位Android版插件

本插件利用百度地图提供的定位功能进行Android版手机定位. 为什么没有iOS版? 因为iOS版有官方的定位插件cordova-plugin-geolocation可以使用. 请参照:cordova-plugin-geolocation Android版为什么不使用官方的cordova-plugin-geolocation插件 最新版的插件已经删除掉的Android版定位的代码,改为基于系统浏览器(chrome内核)进行定位. 为什么这样做,也有人问过同样的问题,作者的回答是这样比原生定位更快

Android利用百度地图定位

百度地图照着百度的教程做的总是出现报错 请帮我看看错误在那 2013-12-13 15:16168海军 | 分类:百度地图 | 浏览1252次 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.map/com.example.map.MainActivity}: android.view.InflateException: Binary XML file line #11: Error i

Android学习个人笔记-百度地图定位sdk的使用

虽然自己已经完成了百度地图的调用,但是在使用过程中产生很多的疑问,在不断的百度各种大神的作品后才慢慢的调试出来,所以觉得作为新手自己应该把这个过程记录下来.尤其是自己在找到大神的文章时,并不能理解有些单纯一个方法和一个解释,主要还是水平有限,在查资料的过程中也深知写好一篇博文对于需要的人来说就是一汪泉水,欣喜的发现这篇博文讲的有头由尾,可以参照一步一步的来进行.记录下来这个过程对于自己也是一种复习,比如当初费尽心思解决的难题再一年后再去看代码却毫无头绪,所以这样的记录还是很有必要的,自己也尽力的

Android 百度地图定位(手动+自动) 安卓开发教程

近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究和咨询,找到了解决方案,在此备忘一下. 注意:定位使用真机才能够真正定位:模拟器的话,在DDMS中的Emulator Control中,选择Manual,下面单选按钮选择Decimal,然后填写经纬度,send后,再点击定位我的位置按钮,就能定位了(这应该算是固定定位,哈哈...). 1.第一步当然

Android百度地图定位

说到百度地图,现在这个时候应该都是众说周知了吧,多的话不扯了,直接奔向主题. 接入百度地图api必须申请key,这里申请key就不用说了,官方文档上面有介绍如何去申请key. 这里使用的百度地图定位是4.2的版本,api是3.1.1版本.如果申请好了key,那么就可以进入编码阶段了,具体实现如下: 1.引入百度地图相关jar包及armeabi目录到libs目录中 2.在项目的AndroidManifest.xml文件中配置相关信息 配置权限 <uses-permission android:na

Android百度地图定位demo

AS写的百度地图定位demo 版本V6.0.5 先上效果图     版权声明:本文为博主原创文章,未经博主允许不得转载.