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 ...
随机推荐
- EF CodeFirst系列(1)---CodeFirst简单入门
1.什么是CodeFirst 从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD).在CodeFi ...
- Angular记录(1)
文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...
- CSS Grid基于网格的二维布局系统(详细教程)
.grid-wrap{ display: inline-flex; padding: 20px; background: #f4f4f4; word-break: initial; } .handle ...
- Java部分概念理解
第1部分 方法 1.1 方法基本概念 1) 方法:用于封装一段特定功能代码,尽可能一个方法至只实现一个基本功能,相当于C语言中的函数: 2) 方法可以多次调用: 3) 避免代码冗余,便于维护,便于团队 ...
- sublime text3格式化html,css,js代码
需要安装HTML/CSS/JS prettify插件. 安装步骤:首选项 -> Package Control -> Install Package -> HTML-CSS-JS P ...
- git切换到新的远程地址
查看仓库链接 git remote -v 修改url链接 git remote set-url origin URL
- django反向解析传参
这两天写代码总是有反向解析传参顺带复习了一下反向解析,以下是简单的反向解析 以下是我最近写的很多的反向解析传参 想要实现点击修改将这些从数据库读取的内容传到另一个页面就要通过id来查询,那么我们就需 ...
- 【easy】202. Happy Number
happy number Write an algorithm to determine if a number is "happy". A happy number is a n ...
- bootstrap 解决弹出窗口(modal) 常见问题
无法使用键盘esc关闭窗口方法: 首先在modal容器的div中增加属性tabindex="-1",其次设置键盘ESC属性keyboard为true: 方法1:使用js打开窗口时 ...
- POST 请求中 multipart/form-data、 application/x-www-form-urlencoded 的区别
以 Postman 为工具来看一下这两个编码类型的数据格式,假设我们需要传输的数据为 { "name": "test", "age": 18 ...