原文: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,设置是否使用gps
option.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接口,在舰艇中对定位进行处理。这里我们做的处理是在定位处方放置定位符号,并添加连线。

        @Override
public 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(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//定位
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myListener); //注册监听函数
//使用BaiduMap SDK
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);//获得地图视图的对象
mBaiduMap = mMapView.getMap();//获得地图对象
//初始化搜索模块,注册事件监听
mSearch = GeoCoder.newInstance();//获得搜索的对象
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public 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();
} @Override
public 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关闭时将地图关闭
*/
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
} /*
ActivityonResume时,将地图onResume。
*/
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
} /*
ActivityonPause时,将地图onPause。
*/
@Override
protected 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,设置是否使用gps
option.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);
} @Override
public 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 { @Override
public 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);
}
}
}
}

Android 位置服务——BaiduLocation的使用的更多相关文章

  1. Android 位置服务

    原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.locati ...

  2. Android位置服务开发

    1. 使用LocationManager获取地理位置信息 代码如下: private TextView positiontext; private String provider; private L ...

  3. [译]:Xamarin.Android平台功能——位置服务

    返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...

  4. Android实现传感器应用及位置服务

    Android实现传感器应用及位置服务 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 这里需用获取加速度传感器和地磁传感器,手机获取旋转的方 ...

  5. 【Android】第18章 位置服务和手机定位—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.简介 目前,基于位置的服务发展迅速,已涉及到商务.医疗.定位.追踪.敏感区域警告.工作和生活等各个方面.定位服务融合了G ...

  6. Android定位服务关闭和定位(悬浮)等权限拒绝的判断

    public void checkLocationPermission() { if (!PermissionHelper.isLocServiceEnable(this)) {//检测是否开启定位服 ...

  7. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  8. Android从服务端获取json解析显示在客户端上面

    Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...

  9. 与众不同 windows phone (20) - Device(设备)之位置服务(GPS 定位), FM 收音机, 麦克风, 震动器

    原文:与众不同 windows phone (20) - Device(设备)之位置服务(GPS 定位), FM 收音机, 麦克风, 震动器 [索引页][源码下载] 与众不同 windows phon ...

随机推荐

  1. Cocos2d-x使用Javascript开发js绑定C++&lt;代码演示样例&gt;

    class IOSiAPDelegate{ public: virtual ~IOSiAPDelegate() {} }; class IOSAlipay{ public: IOSAlipay(); ...

  2. php实现从尾到头打印列表

    php实现从尾到头打印列表 一.总结 4.数组倒序:array_reverse() 5.函数肯定要return,而不是echo 二.php实现从尾到头打印列表 输入一个链表,从尾到头打印链表每个节点的 ...

  3. 超级牛X的免费开源小工具之tldr

    github介绍:http://tldr-pages.github.io/ github源码:https://github.com/tldr-pages/tldr 什么是tldr? 新命令行世界?还是 ...

  4. PHP+Aax实现异步验证

    利用Ajax技术来检测用户名是否存在的原理流程图: 最终结果截图: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...

  5. oracle员工表和部门表基本操作

    emp 员工表(empno 员工号/ename 员工姓名/job 工作/mgr 上级编号/hiredate 受雇日期/sal 薪金/comm 佣金/deptno 部门编号) dept 部门表(dept ...

  6. 怎样收缩超大的SharePoint_Config数据库

    前言 在已经执行了2年多的SharePointserver上,发现SharePoint_Config的数据库文件越来越大,已经达到90几个GB,收缩能够减小20几个GB,可是一周以后又会恢复到90几个 ...

  7. 用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: 1 2 3 ./c ...

  8. 注册表 Run、RunOnce 浅析

    绝大多数使用过 Windows 操作系统的用户都不会对注册表的 Run.RunOnce 键值感到陌生,但你真的了解所有这些键值的细节吗?让我们具体说来. 本文在Win2000,WinXp.Vista. ...

  9. phpStudy的localhost不能访问怎么解决(相关性)

    phpStudy的localhost不能访问怎么解决(相关性) 一.总结 1.注释掉httpd.conf文件中的#ServerName localhost:80   这句话. 2.既然是localho ...

  10. gcc新版本号引起的编译错误(命令运行时的外部库输入位置)

    昨天,遇到一个比較bug的错误,用gcc来编译几个简单的文件出错,编译环境为x86_64的Ubuntu12.04.gcc版本号号例如以下: gcc (Ubuntu/Linaro 4.6.3-1ubun ...