LBS(Location Based Service)(基于位置的服务)
LBS(Location Based Service)(基于位置的服务)
Android 中定位方式基本可以分为两种:GPS定位,网络定位。
GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星进行交互来获取当前的经纬度信息,这种方式的精确度非常高,但是缺点是只能在室外使用,而且费电。
网络定位的工作原理是根据手机当前的网络附近的三个基站进行测速,以此计算出手机和每个基站之间的距离,再通过三角定位确定出一个带盖的位置,这种方式优点是在室内外都可以使用,但是精确度一般。
百度地图类参考:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_4_1/index.html?overview-summary.html
1.获取API Key
接下来,我们将基于百度地图SDK来开发。该SDK免费对外开发,且使用无次数限制。不过使用前需要申请秘钥(AK)才可以使用。
首先需要注册一个百度账号然后申请API Key, 申请地址: http://lbsyun.baidu.com/apiconsole/key
Android 定位SDK 官方指南:http://lbsyun.baidu.com/index.php?title=android-locsdk
创建应用:
http://lbsyun.baidu.com/apiconsole/key

关于获取SHA1:
(1) cd c:\Users\用户名\.android
(2) keytool -list -v -keystore debug.keystore
(3)直接回车,不需要输入密码
(4)然后就可以查看到 SHA1
注意这个SHA1为开发版SHA1指纹
提交之后就可以看到我们申请到的AK了:

2.下载 LBS SDK
下载地址:http://lbsyun.baidu.com/sdk/download
选择我们需要的功能,然后点击开发包开始下载

下载时候解压,包文件下载到对应目录下:

注意jniLibs目录需要自己创建;
解压后的 so 文件为C/C++语言进行编写,然后在用NDK 编译出来的。
3.开发
获取当前位置信息官方文档: http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc
- 获取位置信息, MainActivity 类:
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private TextView tvPosition;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener()); //注册调用函数
tvPosition = (TextView) findViewById(R.id.activity_main_tv_position);
/**
* 运行时权限申请 */
List<String> permissionList = new ArrayList<>(); //存储需要申请的所有权限
//GPS 定位信息
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
//读取手机当前状态
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
//读写外部存储
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
//若没有权限则申请权限
if (!permissionList.isEmpty()) {
String[] permissions=permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions, 1);
} else {
requestLocation();
}
}
/**
* 开始定位
*/
private void requestLocation() {
initLocation();
// 开始定位,回调结果会返回我们注册的监听器中 MyLocationListener
mLocationClient.start();
}
private void initLocation(){
//LocationClientOption类,该类用来设置定位SDK的定位方式
LocationClientOption option=new LocationClientOption();
/**设置发起定位请求的时间间隔,默认0,即仅定位一次 */
option.setScanSpan(5000);
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,设置是否需要地址信息,默认不需要
option.setIsNeedAddress(true);
//可选,默认false,设置是否使用gps
option.setOpenGps(true);
//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationDescribe(true);
//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.setIgnoreKillProcess(false);
mLocationClient.setLocOption(option);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if(grantResults.length >0){
for(int result:grantResults){
if(result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "必须同意所有权限才能使用该程序", Toast.LENGTH_SHORT).show();
finish(); //退出程序
return;
}
}
requestLocation(); //开始定位
}else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop(); //活动销毁后停止定位,减少电量消耗
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
StringBuilder currentPosition = new StringBuilder();
currentPosition.append("纬度:" + bdLocation.getLatitude() + "\n");
currentPosition.append("经度:" + bdLocation.getLongitude() + "\n");
currentPosition.append("定位方式:");
int locType= bdLocation.getLocType(); //获取定位方式
if (locType== BDLocation.TypeGpsLocation) {
currentPosition.append("GPS\n");
} else if (locType == BDLocation.TypeNetWorkLocation) {
currentPosition.append("网络\n");
}
currentPosition.append("LocationDescribe:" + bdLocation.getLocationDescribe() + "\n");
currentPosition.append("Country:" + bdLocation.getCountry() + "\n");
currentPosition.append("Province:" + bdLocation.getProvince() + "\n");
currentPosition.append("City:" + bdLocation.getCity() + "\n");
currentPosition.append("District:" + bdLocation.getDistrict() + "\n");
currentPosition.append("Street:" + bdLocation.getStreet() + "\n");
currentPosition.append("StreetNumber:" + bdLocation.getStreetNumber() + "\n");
currentPosition.append("AddrStr:" + bdLocation.getAddrStr() + "\n");
tvPosition.setText(currentPosition); //显示到界面当中
}
}
}
在地图中显示位置
首先地图中添加 MapView控件
<com.baidu.mapapi.map.MapView
android:id="@+id/activity_map_mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/>
MapActivity :
public class MapActivity extends AppCompatActivity {
public LocationClient mLocationClient;
private MapView mapView;
private BaiduMap baiduMap;
private boolean isFirstLocate=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_map);
getSupportActionBar().hide();//隐藏ActionBar
mapView=(MapView)findViewById(R.id.activity_map_mapView);
baiduMap=mapView.getMap();
baiduMap.setMyLocationEnabled(true); //显示当前设备位置
baiduMap.setCompassEnable(true); //是否显示指南针
//baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);//卫星地图
requestLocation();
}
/**
* 设置地图显示位置
*/
private void navigateTo(BDLocation location){
if(isFirstLocate){
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); //用于存放经纬度
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(update);
update =MapStatusUpdateFactory.zoomTo(16f); //设置缩放级别
baiduMap.animateMapStatus(update);
isFirstLocate=false;
}
//显示当前位置图标
MyLocationData.Builder builder=new MyLocationData.Builder();
builder.latitude(location.getLatitude());
builder.longitude(location.getLongitude());
MyLocationData locationData=builder.build();
baiduMap.setMyLocationData(locationData);
}
/**
* 开始定位
*/
private void requestLocation() {
initLocation();
// 开始定位,回调结果会返回我们注册的监听器中 MyLocationListener
mLocationClient.start();
}
private void initLocation(){
//LocationClientOption类,该类用来设置定位SDK的定位方式
LocationClientOption option=new LocationClientOption();
/**设置发起定位请求的时间间隔,默认0,即仅定位一次 */
option.setScanSpan(5000);
mLocationClient.setLocOption(option);
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//如果已经定位成功
if(bdLocation.getLocType()==BDLocation.TypeGpsLocation
||bdLocation.getLocType()==BDLocation.TypeNetWorkLocation){
navigateTo(bdLocation);
}
}
}
}
LBS(Location Based Service)(基于位置的服务)的更多相关文章
- LBS 基于位置的服务
LBS (Location Based Services)基于位置的服务 基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位 ...
- Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...
- Android学习之基础知识十四 — Android特色开发之基于位置的服务
一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...
- Govern Service 基于 Redis 的服务治理平台
Govern Service 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Govern Service 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK,通过 ...
- 基于位置的服务——百度地图SDK练习
基于位置的服务所围绕的核心就是要先确定出用户所在的位置.通常有两种技术方式可以实现:一种是通过GPS定位,一种是通过网络定位.Android对这两种定位方式都提供了相应的API支持.但由于众所周知的原 ...
- LBS(基于位置服务)
ylbtech-杂项:LBS(基于位置服务) 基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标 ...
- (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案
一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...
- (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案
在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...
- 3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程
3.3 Execution Flow of a DDD Based Application 基于DDD的应用程序执行流程 The figure below shows a typical reques ...
随机推荐
- nowcoder16450 托米的简单表示法
题目链接 思路 仔细理解一下题意可以发现. 对于每个完整的括号序列都是独立的,然后就想到分治.高度是序列中所有括号序列的最大值,宽度是所有括号序列宽度和\(+1\). 然后仔细想了一下,这种分治应该是 ...
- tarjan模板
tarjan #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring& ...
- Mac 终端美化方法
美化终端,主要是主题,字体,命令行提示3个方面. 主题 使用的主题是Solarized Dark主题. 安装主题: git clone git://github.com/altercation/sol ...
- nodemon 热更新
sudo npm i -g nodemon nodemon app.js
- Docker下安装rabbitmq
拉取镜像 docker pull rabbitmq:-management 启动镜像(默认用户名密码),默认guest 用户,密码也是 guest docker run -d --: -p : rab ...
- ES6 Class语法学习
前言 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript ...
- Filebeat+ELK部署文档
在日常运维工作中,对于系统和业务日志的处理尤为重要.今天,在这里分享一下自己部署的Filebeat+ELK开源实时日志分析平台的记录过程,有不对的地方还望指出. 简单介绍: 日志主要包括系统日志.应用 ...
- Oracle10gXE和Oracle SQL Developer本地安装配置
第1部分 Oracle10gXE安装 Oracle10gXE安装的安装几乎是一路next就可以安装好:但是中间设置的用户名.密码.口令.SID等信息一定记住,后面需要使用. 第2部分 Oracle S ...
- 基于89C51/52单片机的红外线遥控驱动
目录 说明 IR.h IR.c 说明 编码格式:NEC IR.h /************************************************************ * @Pr ...
- mybatis(入门级项目)
框架的搭建:(两个java类,两个xml配置文件) 1.导入jar包,日志debug文件以及数据库的参数文件 2.建立持久化类(和数据库的列值相同的类) user类的一个扩展类: userQueryV ...