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)(基于位置的服务)的更多相关文章

  1. LBS 基于位置的服务

    LBS (Location Based Services)基于位置的服务 基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位 ...

  2. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK

    原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  3. Android学习之基础知识十四 — Android特色开发之基于位置的服务

    一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...

  4. Govern Service 基于 Redis 的服务治理平台

    Govern Service 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Govern Service 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK,通过 ...

  5. 基于位置的服务——百度地图SDK练习

    基于位置的服务所围绕的核心就是要先确定出用户所在的位置.通常有两种技术方式可以实现:一种是通过GPS定位,一种是通过网络定位.Android对这两种定位方式都提供了相应的API支持.但由于众所周知的原 ...

  6. LBS(基于位置服务)

    ylbtech-杂项:LBS(基于位置服务) 基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网.CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标 ...

  7. (转)基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案

    一.前言.提出问题 公司最近举行2011年度创新设计大赛,快年底了正打算写写2010年以来Android开发的心得与经验,正好同事出了个点子:假如A和B两个人分别在不同的地点,能不能实现这样的功能,让 ...

  8. (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案

    在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...

  9. 转:无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

    今天看到一篇文章感觉不错,收藏转载下. 原文地址:http://blog.csdn.net/sntyy/article/details/2090347 版权为原作者所有 无法向会话状态服务器发出会话状 ...

随机推荐

  1. SVO实时全局光照优化(里程碑MK0):Sparse Voxel Octree based Global Illumination (SVO GI)

    完全自主实现,bloat-free.再次声明,这不是UE.U3D.CE.KlayGE! 老规矩,先贴图.后面有时间再补充描述. 1. 支持多跳间接全局光照2. 支持vxao/so.vxdiff/spe ...

  2. Ubuntu 16.04 LTS Final Beta about JAVA

    我们知道Ubuntu里可能会事先安装了openjdk.但是我习惯于Oracle jdk. ## < 卸载 openjdk > successfully: ### Terminal comm ...

  3. Spring Autowiring by AutoDetect

    In Spring, "Autowiring by AutoDetect", means chooses "autowire by constructor" i ...

  4. Yii数据库

    http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar http://zhengdl126.iteye.com/blog/1460779 ...

  5. JS函数的属性

    1.arguments.callee //经典的阶乘(递归)函数 function factorial(num) { if (num <= 1) { return 1; } else { ret ...

  6. PHP连接Access数据库代码

    使用php的odbc函数,不创建数据源. $connstr="DRIVER=Microsoft Access Driver (*.mdb);DBQ=".realpath(" ...

  7. swiper使用中一些点的总结

    最近做了PC端改版,要求移动端有更好的体验,一些产品滚屏的展示,就用了swiper插件,以方便用户在移动端访问可以滑动翻屏展示. 本次项目中使用的是swiper2.0版本. 首先要引入swiper的j ...

  8. JavaWeb基础-Jsp的请求与响应

    JSP请求和相应 HTTP头信息 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的. HttpServletRequest类 r ...

  9. nodejs+mysql入门实例(链接到数据库)

    //连接数据库 var mysql = require('mysql'); var connection = mysql.createConnection({ host: '******', //数据 ...

  10. python数据类型之间的转换

    1,字符串转整型,前提条件是该字符串为纯数字. a = '1' a = int(a) 2,整型转字符串 a= 1 a = str(a) 3,整型转浮点型 a = 1 a = float(a) 4,浮点 ...