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 ...
随机推荐
- os.listdir()、os.walk()和os.mkdir()的用法
内容主要参照博客https://blog.csdn.net/xxn_723911/article/details/78795033 http://www.runoob.com/python/os-wa ...
- openssl命令行将pfx格式转.key和.crt文件,Apache适用
以前使用的windows平台作为php运行的平台,感觉整体速度太慢,于是现在改为centos系统的linux平台.需要把windows中用pfx证书转为appache用到key和crt组成的证书 将* ...
- qt: 系统默认程序打开文件或者软件;
Qt提供了QDesktopServices类, 可以利用openUrl函数调用默认程序打开文件: 源码参考: #ifdef Q_OS_WIN32 m_szHelpDoc = QString(" ...
- 系统磁盘优化——"/var/spool/postfix/maildrop"
文件清理 最近某服务器磁盘空间告警,在排查过程中发现"/var/spool/postfix/maildrop"目录下堆积了很多小文件,起初想直接删除,但是使用rm删除是提示“参数列 ...
- python httpserver
python3: python -m http.server 80 python2: python -m SimpleHTTPServer 9004
- SpringCloud笔记二:搭建项目基础框架
目录 搭建框架 新建父工程 新建子工程api 新建子工程提供者provider 新建消费者consumer 总结 搭建框架 我们的SpringCloud微服务框架是父子工程,有一个父工程,剩下的都是子 ...
- Entity Framework入门教程(19)---EF中使用事务
EF中使用事务 这节介绍EF6中事务的使用.EF core中事务的使用方式和EF6中一模一样. 1.EF中的默认的事务 默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然 ...
- 从Socket入门到BIO,PIO,NIO,multiplexing,AIO(未完待续)
Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...
- django - 总结 - CRM - 知识点
1.扩展auth_user from django.contrib.auth.models import User,AbstractUser class UserInfo(AbstractUser): ...
- [物理学与PDEs]第4章第1节 引言
1. 本章讨论可燃流体在流动过程中同时伴随着燃烧现象的情况. 2. 燃烧有两种, 一种是爆燃 (deflagration): 火焰低速向前传播, 此时流体微元通常是未燃气体.已燃气体的混合物; 一 ...