原文: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. OpenGL_ES-纹理

    OpenGL_ES2.0 -纹理 一:纹理基础: 1: 纹素的概念: 一个二维纹理在OpenGLES2.0中是非经常见的,二维纹理就是一个二维数组,每一个数据元素称为纹素,详细格式例如以下: GL_R ...

  2. Windows平台CUDA开发之前的准备工作

    CUDA是NVIDIA的GPU开发工具,眼下在大规模并行计算领域有着广泛应用. windows平台上面的CUDA开发之前.最好去NVIDIA官网查看说明,然后下载对应的driver. ToolKits ...

  3. INotifyPropertyChanged接口的详细说明

    在windows phone开发8.1:数据绑定中,我们了解了数据绑定的基本知识.今后几篇文章会继续深入了解数据绑定.今天我们来看在数据绑定中十分重要的INotifyPropertyChanged接口 ...

  4. [RxJS] Use RxJS mergeMap to map and merge high order observables

    Like RxJS switchMap() is a shortcut for map() and switch(), we will see in this lesson how mergeMap( ...

  5. An Overview of Cisco IOS Versions and Naming

    An Overview of Cisco IOS Versions and Naming http://www.ciscopress.com/articles/article.asp?p=210654 ...

  6. 批量解决 word/wps 中公式和文字不对齐的问题

    完美解决Word或wps中中公式和文字对不齐的问题 在 word 的各个版本中,当公式和字符同时出现时,尤其是发生公式的拷贝粘贴时,公式往往会出现上飘或下移的情况,这里给出一个简单易行的解决方案: 全 ...

  7. tensorflow 的使用流程

    1. optimizer.minimize 与 global_step optimizer = tf.train.**(learning_rate) global_step = tf.Variable ...

  8. Erlang 聊天室程序

    Erlang 聊天室程序( 一) Erlang 聊天室程序(二) 客户端的退出 Erlang 聊天室程序(三) 数据交换格式---json的decode Erlang 聊天室程序(四) 数据交换格式- ...

  9. erlang应用发布

    http://blog.csdn.net/zhangxinrun/article/details/6993892 参考“转载1”和“转载2”就可以了,但需要注意以下两点: 1.如果用rebar - c ...

  10. 【codeforces 782A】Andryusha and Socks

    [题目链接]:http://codeforces.com/contest/782/problem/A [题意] 如果手套没有成一双,那么其中的一只就会被放在桌子上; 问你桌子上手套的只数最多的时候有几 ...