Android 位置服务——BaiduLocation的使用

Android 位置服务——BaiduLocation的使用
原文:Android 位置服务——BaiduLocation的使用

版权声明:本文为博主原创文章,欢迎转载,转载请在文章显眼处说明文章出处并给出连接。 https://blog.csdn.net/To_be_Designer/article/details/48685475

  这一节我们使用Baidu的定位服务,我们同样要向上一篇博客一样下载Baidu定位的SDK。因为在《Android 位置服务——BaiduMap的使用 》这篇博客中我们已经讲过下载步骤,这里我们不在重复讲解下载的过程,不明白的可以直接去上一篇博客中学习。
  这一节的讲解是以上一节中百度地图为基础的,使用的是上一节的项目工程。建议大家先看一下《Android 位置服务——BaiduMap的使用 》。

  其实这里的步骤和Baidu定位中提供的文档是差不多的,此处整理的目的只为加深楼主的印象。

Baidu定位环境配置

1. 首先将jar包拷贝到libs文件夹下。
2. 通过Android Studio “File——>Project Structure——>Dependencies”中的File Dependency将我们刚才拷贝的.jar包导入。
3. 其次在main文件夹下创建一个“jniLibs”的文件夹,将包含.so文件的文件夹复制到此处。
4. 配置AndroidManifext.xml.

  • 在application标签中声明service组件,每个app拥有自己单独的定位service
 <service
            android:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service>
  • 设置AcessKey
<meta-data
            android:name="com.baidu.lbsapi.API_KEY"android:value="key" />
  • 声明权限
<!-- 这个权限用于进行网络定位-->
<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>

Baidu定位使用

  再次声明下这里使用的项目是基于《Android 位置服务——BaiduMap的使用 》这篇博客的,在此基础上进行定位功能呢的添加。

1.初始化LocationClient类。

public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();public void onCreate() {mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类mLocationClient.registerLocationListener( myListener );    //注册监听函数//以上两句卸载setContentView(R.layout.activity_main)之前。
}

2. 配置定位SDK参数。

private void initLocation(){LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span=1000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要mLocationClient.setLocOption(option);}

高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;

低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);

仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。

3. 实现BDLocationListener接口,在舰艇中对定位进行处理。这里我们做的处理是在定位处方放置定位符号,并添加连线。

        @Overridepublic void onReceiveLocation(BDLocation location) {if (location.getLocType() == BDLocation.TypeServerError) {} else if (location.getLocType() == BDLocation.TypeNetWorkException) {} else if (location.getLocType() == BDLocation.TypeCriteriaException) {} else {mTextViewLocation.setText(location.getAddress().address);currentLongtitude = location.getLongitude();currentLatitude = location.getLatitude();mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));LatLng p = new LatLng(currentLatitude, currentLongtitude);points.add(p);}}}

结果如下:

这里写图片描述

全部代码如下:

public class MainActivity extends Activity implements View.OnClickListener {private Button mButtonStart;//开始定位按钮private Button mButtonOne;//获取地址一按钮private Button mButtonTwo;//获取地址二按钮private Button mButtonLine;//划线按钮private TextView mTextViewLocation;//显示当前的地址MapView mMapView = null;//地图视图BaiduMap mBaiduMap;//地图对象//连线点的集合private List<LatLng> points = new ArrayList<LatLng>();//通过地址获得经纬度GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//定位mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类mLocationClient.registerLocationListener(myListener);    //注册监听函数//使用BaiduMap  SDK//在使用SDK各组件之前初始化context信息,传入ApplicationContextSDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);//获取地图控件引用mMapView = (MapView) findViewById(R.id.bmapView);//获得地图视图的对象mBaiduMap = mMapView.getMap();//获得地图对象//初始化搜索模块,注册事件监听mSearch = GeoCoder.newInstance();//获得搜索的对象mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();return;}mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));LatLng p = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);//添加点points.add(p);String strInfo = String.format("纬度:%f 经度:%f",geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);Log.d("data", strInfo);Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {}});//获取布局中的各个控件对象mButtonStart = (Button) findViewById(R.id.button_start);mButtonOne = (Button) findViewById(R.id.button_one);mButtonTwo = (Button) findViewById(R.id.button_two);mButtonLine = (Button) findViewById(R.id.button_three);mTextViewLocation = (TextView) findViewById(R.id.textview_location);//设置点击事件mButtonStart.setOnClickListener(this);mButtonOne.setOnClickListener(this);mButtonTwo.setOnClickListener(this);mButtonLine.setOnClickListener(this);PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, "5CjXwt6IZgRSfYxwA8dtOuG5");}/*Activity关闭时将地图关闭*/@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}/*ActivityonResume时,将地图onResume。*/@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}/*ActivityonPause时,将地图onPause。*/@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}/*初始化定位*/private void initLocation() {LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span = 1000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要mLocationClient.setLocOption(option);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.button_start:initLocation();mLocationClient.start();//开始定位break;case R.id.button_one://获得天安门的地址mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀区中关村海龙大厦"));break;case R.id.button_two://获得中关村的地址mSearch.geocode(new GeoCodeOption().city("北京市").address("西城区西便门"));break;case R.id.button_three://获得当地的地址// 添加折线OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);mBaiduMap.addOverlay(ooPolyline);break;}}//获得当前的经纬度private double currentLongtitude;private double currentLatitude;class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location.getLocType() == BDLocation.TypeServerError) {} else if (location.getLocType() == BDLocation.TypeNetWorkException) {} else if (location.getLocType() == BDLocation.TypeCriteriaException) {} else {mTextViewLocation.setText(location.getAddress().address);currentLongtitude = location.getLongitude();currentLatitude = location.getLatitude();mBaiduMap.addOverlay(new MarkerOptions().position(new LatLng(currentLatitude, currentLongtitude)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)));LatLng p = new LatLng(currentLatitude, currentLongtitude);points.add(p);}}}
}
posted on 2018-09-21 16:54 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9687386.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net通过登录后修改个人信息_微信号终于可以修改了!快来改一个

上周&#xff0c;微信在安卓端开启了“修改微信号”功能的灰度测试&#xff0c;这也预示着这项新功能很快就能和我们见面了。果不其然&#xff0c;就在刚才微信正式上线了修改微信号的功能&#xff0c;大家期盼多年的功能终于上线了&#xff01;&#xff01;&#xff01;安卓用…

会唱歌的路

文 | 贰沐编辑 | 贰沐 子鱼会唱歌的路&#xff1f;&#xff01;是什么意思&#xff1f;是说路会自己唱歌吗&#xff1f;开车行驶在普通的道路上&#xff0c;我们能够听到“嗡嗡”的各种杂乱无章的声音&#xff0c;而在有些特殊的路上&#xff0c;我们可以听到路面在发出有节奏的…

那些年,我和发哥在恒大的日子

在广州上班那会&#xff0c;我们在恒大中心旁边的利通大厦上班&#xff0c;我和薛总每天一起上下班&#xff0c;那时候宿舍还有盼盼&#xff0c;有时候玩开心的时候&#xff0c;我就会跟他们说&#xff0c;等过了很多年后&#xff0c;我们要写一本说&#xff0c;书的名字就叫做…

KEIL高级调试——条件断点

在线调试程序时&#xff0c;打断点是非常有效的一种方式&#xff0c;配合单步调试&#xff0c;可以快速定位问题。但是有时候&#xff0c;手动打断点用起来不是那么方便。比如想要在一个循环的第N次停下来&#xff0c;如果手动打断点&#xff0c;那就要不停的点击单步运行&…

emailjava中怎么校验_Java使用注解实现参数统一校验功能

在项目开发中&#xff0c;当使用配置文件的时候&#xff0c;需要对一些配置参数进行合法校验&#xff0c;如果不存在则会抛出异常或者提醒用户重新修改配置文件后运行系统。 以前的做法就是读取到配置文件后&#xff0c;每个配置项挨个检查&#xff0c;写多个if判断是否存在问题…

原来保险丝熔断原理是这样的

如果电路中的保险丝熔断了&#xff0c;想亮起一个灯来指示&#xff0c;可以考虑用这个电路&#xff1a;这个电路的工作逻辑&#xff1a;当保险丝F1正常工作时&#xff0c;只亮起绿灯LED2。当保险丝F1熔断时&#xff0c;熄灭绿灯LED2&#xff0c;亮起红灯LED1&#xff0c;告诉人…

docker 定时重启脚本_使用 Go 添加启动脚本

简介实践困惑总结当前部分的代码简介虽然 Makefile 能很好的整合各种命令, 是一个非常方便的工具. 但启动脚本也是必不可少的, Makefile 更多用于开发阶段, 比如编译, 单元测试等流程.启动脚本的作用是控制程序的状态, 管理程序的启动, 停止, 查询运行状态等.实践直接上脚本了:…

为什么我的U盘空间变小了:图解 FAT 文件系统基础知识

作者 | 鱼鹰Osprey转自 | 鱼鹰谈单片机FAT 文件系统是什么&#xff0c;当你格式化 U 盘之后 U 盘发生了什么&#xff0c;为什么删除的文件还可以再恢复&#xff1f;买的 U 盘明明写着 16 G&#xff0c;实际却只有15 G&#xff0c;这里隐藏了什么事实&#xff1f;FAT 文件系统随…

如何DIY一款属于自己的HID键盘?

这是一个自定义游戏键盘&#xff0c;带有四个热插拔机械键和可自定义的RGB LED。它由STM32F103Cx微控制器供电&#xff0c;并通过Arduino IDE进行编程。文章末尾分享该项目资料。功能概述&#xff1a;快速STM32F103Cx微控制器可实现低输入延迟。USB全速&#xff0c;轮询速率为1…

arm9重启ssh服务_部署ssh使用rsa登录配置

什么是ssh?ssh专为远程登录会话和其他网络服务提供安全性的协议&#xff0c;利用ssh协议可以有效的防止远程管理过程中的信息泄露问题。使用ras公钥登录linux操作环境本地服务器&#xff1a;win10 远程服务器&#xff1a;centos 8 git环境生成rsa文件在windows机器上&#xff…

Android MVP模式简单易懂的介绍方式 (一)

Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式。看了很多文章&#xff0c;基本上都是长篇大论&#xff0c;一堆理论。但这里&#xff0c;我们不从理论出发&#xff0c…

什么?TTL信号也能高速稳定传输100m+?是的,你没有听错,量产电路推荐!

作者&#xff1a;周工&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;TTL传输100米&#xff0c;是不是很惊讶&#xff1f;早就看透了你的心思。传输100米&#xff0c;干嘛不用差分信号&#xff1f;就知道你…

the params of sys aud mod req msgs from TV

sys aud mode req msg sent from TV to AMP has a param of PA of src dev, while sys aud mode req msg sent from TV to AMP hasnt any param: aud sys mod request from TV: sys aud mod req(off) from TV: 转载于:https://www.cnblogs.com/aspirs/p/9708831.html

一定要坚强

想写这篇文章的时候&#xff0c;是因为确实知道发生了一些事情。我应该没有跟大家说过一件事情&#xff0c;我在TCL的时候&#xff0c;因为一件很不爽的事情&#xff0c;跟同事差点打架了&#xff0c;起因是因为睡觉的时候&#xff0c;他一直在打呼噜&#xff0c;然后我晚上我根…

致驱动工程师的一封信

引言 作为一个算是合格的驱动工程师&#xff0c;总是有很多话想说。代码看的多了总是有些小感悟。可能是吧。那就总结一下自己看的代码的一些感悟和技巧。如何利用你看的这些代码&#xff1f;如何体现在工作的调试中。作为驱动工程师&#xff0c;主要的工作就是移植各种驱动&am…

我的博客搭建(3)

hexo生成工程文件介绍 hexo插件 主题yilia 默认目录结构 具体参考 |--.deploy |--public |--scaffolds |--source |--themes |--_config.yml |--package.json .deploy &#xff1a;部署到GitHub上的内容目录public&#xff1a;输出的静态网页内容目录scaffolds&#xff1a;layo…

Oracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262

一. Bug 问题表现 2011年安装Oracle 10.2.0.4 和10.2.0.5 版本时&#xff0c;在配置OEM的时候会报错。 忽略这个错误后&#xff0c;DB 可以成功创建或者升级。 MOS 上关于这个bug的说明&#xff0c;参考&#xff1a;[ID 1222603.1] 该bug 的表现为DBCA和DBUA 配置失败&#xff…

C语言不调用库函数画直线

昨天写了一个代码&#xff0c;使用C语言画三角形&#xff0c;既然写了那个&#xff0c;那就继续画一条直线&#xff0c;这个也很有意思。C语言不调用库函数画一个三角形直线的方程是如下图所示— — 斜率的范围(-∞,∞)既然知道公式了&#xff0c;我们就直接上代码吧&#xff0…

Shell教程

shell编程 shell历史执行脚本基本语法 变量文件名代换Globbing命令代换算术代换转义字符单引号双引号Shell脚本语法 条件测试条件分支 ifthenelifelseficaseesac循环 fordodonewhiledodonebreak和continue位置参数和特殊变量输入输出 echo管道tee文件重定向函数Shell脚本调试方…

尘埃落定,初心未改——一个大学生的电子大赛感悟

大家好&#xff0c;我是写代码的篮球球痴这篇文章是一位参加电子竞赛的总结文章&#xff0c;分享给大家。也欢迎更多的读者给我投稿&#xff0c;采纳后会有礼物赠送。01.一腔热血定乾坤2020年&#xff0c;怀着一腔热血踏入大学。比起高中那个被学业充斥的时代&#xff0c;迈入大…