基于位置的服务包括三个方面:获取位置、地图服务、地理编码服务。

  • 获取位置有两种方式,一种是通过GPS获得位置,精度高,耗电高,另一种是通过WLAN或通讯基站获得位置,精度低,耗电低。得到的位置信息是三维的,包括经度、纬度、海拔。
  • 地图服务实现的功能是将经纬度点显示在地图上,以及将地图上的点转化为经纬度。通过调用地图服务商(如谷歌、百度、高德等)的API接口,从其服务器上获取地图信息。
  • 地理编码服务实现经纬度点转化为地址,以及地址转化为经纬度。实现方法是通过HTTP协议调用互联网上的地址服务。

获取位置是所有基于位置的服务的基础,Android获取位置使用LocationManager类。首先获取LocationManager的实例,然后一般要检查位置服务是否开启。如果未开启,就打开设置位置服务界面。如果已开启,再检查应用的定位权限是否允许。都通过了,就可以设置一个位置监听器,有了位置信息就会调用监听器的相应方法。设置监听器时可以设置位置监听的最小时间间隔和最小距离间隔,只有这两个条件都满足时才会有位置信息。流程和关键代码如下图:

下面是一个获取位置的例子。例子的界面如下,最上面一行是两项设置,记录位置的最小时间间隔和最小距离,只有这两个条件同时满足,才会产生一个位置数据。第二行是两个按钮,分别启动和停止位置监听。再下面是一个文本,显示监听到的位置信息。

例子中,首先要在onCreate中获取LocationManager实例,并检查设备是否开启了位置服务,代码如下:

manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {askLocationSettings();
}

可以从手机最上面的功能栏中开启/关闭手机的位置服务,如下图:

如果位置服务未开启,可以询问用户是否转到位置服务设置界面。位置服务设置界面通过Intent来启动,动作是android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS。代码如下:

void askLocationSettings(){AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("开启位置服务");builder.setMessage("本应用需要开启位置服务,是否去设置界面开启位置服务?");builder.setPositiveButton("是", new DialogInterface.OnClickListener() {public void onClick(DialogInterface arg0, int arg1) {Intent intent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);MainActivity.this.startActivity(intent);}});builder.setNegativeButton("否", new DialogInterface.OnClickListener() {public void onClick(DialogInterface arg0, int arg1) {Toast.makeText(MainActivity.this, "No location provider to use", Toast.LENGTH_SHORT).show();}});builder.show();
}

位置服务设置界面如下:

如果设备开启了位置服务,就可以创建一个位置信息监听器,在监听时需要传给LocationManager。在事件监听方法中将经度、纬度、高度、速度等位置信息输出。代码如下:

listener = new LocationListener(){public void onLocationChanged(Location arg0) {String txt = "Longitude:" + arg0.getLongitude() + ", Latitude:" +  arg0.getLatitude()+ ", Altitude" + arg0.getAltitude()+ ", Speed:" + arg0.getSpeed(); // 经度,纬度,高度,速度tvResult.append(txt + "\n");}public void onProviderDisabled(String arg0) {}public void onProviderEnabled(String arg0) {}public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
};

启动位置监听需要调用LocationManager的requestLocationUpdates()方法,方法的第一个参数是位置服务提供者。一个设备上可能有多个位置服务提供者,比如gps,wifi,北斗等,所以要先根据定位需求寻找一个最匹配的提供者,使用的方法是LocationManager的getBestProvider()方法。另外,获取当前位置需要一定的时间,而有些应用又已启动就需要一个定位信息,此时可以使用上次使用时的最后已知位置。该位置保存在缓存中,可以通过LocationManager的getLastKnownLocation()方法获得。具体代码如下:

 void startListening(){Criteria crt = new Criteria();                        // 位置监听标准crt.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);    // 水平精度高crt.setAltitudeRequired(true);                        // 需要高度String provider = manager.getBestProvider(crt, true);    // 寻找最匹配的providerLocation l = manager.getLastKnownLocation(provider);    // 取最后已知位置,即缓存中的位置if(l!=null)  tvResult.append(provider + "-LastKnown:" + l.toString() + "\n");long period = Long.parseLong(etPeriod.getText().toString());        // 最小时间间隔int distance = Integer.parseInt(etDistance.getText().toString()); // 最小距离manager.requestLocationUpdates(provider, period*1000, distance, listener);   // 开始监听tvResult.append(provider + "-Location listener started.\n");
}

Android6.0以上系统需要应用运行时进行动态权限申请,所以在开始监听位置前需要检查权限,如果没有许可就进行询问。主要代码是:

if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 101);return;
}

停止位置监听使用LocationManager的removeUpdates()方法,代码如下:

manager.removeUpdates(listener);
tvResult.append("Location listener stoped.\n");

监听位置需要在配置文件里声明权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

例子中用到的相关类包括:

1)android.location.LocationManager类,方法有:

  • boolean isProviderEnabled(String provider):返回提供位置的provider是否开启,provider的取值一般为LocationManager.GPS_PROVIDER或LocationManager.NETWORK_PROVIDER
  • String getBestProvider(Criteria criteria, boolean enabledOnly):返回与要求最匹配的provider,criteria为精度等要求,enabledOnly为true时只匹配已开启的provider,返回值一般为LocationManager.GPS_PROVIDER、LocationManager.NETWORK_PROVIDER或LocationManager.PASSIVE_PROVIDER(从其他应用获得位置)
  • Location getLastKnownLocation(String provider):返回上次已知位置,是上次获取位置时存放在缓存中的,不一定准确反映现在位置。若provider未开启会返回null。
  • void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener):注册当前Activity来接收provider提供的位置信息。位置信息周期性产生,最小时间间隔为minTime毫秒,最小距离间隔为minDistance米,产生后会调用listener的onLocationChanged方法。minTime越小,位置服务搜索越频繁,耗电越多,最好不要小于60000毫秒。此方法必须在主线程中调用。
  • void removeUpdates(LocationListener listener):移除位置监听器
  • void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent):位置变化后以广播PendingIntent的形式通知,可以在子线程中调用。
  • void removeUpdates(PendingIntent intent):移除位置通知广播

2)android.location.Criteria类,方法有:

  • void setHorizontalAccuracy(int accuracy):设置水平精度要求,accuracy取值为Criteria.ACCURACY_HIGH,ACCURACY_MEDIUM,ACCURACY_LOW
  • void setAltitudeRequired(boolean altitudeRequired):设置是否需要高度数据

3)android.location.Location类,方法有:

  • double getLongitude():返回经度
  • double getLatitude():返回纬度
  • double getAltitude():返回高度
  • float getSpeed():返回速度,单位米/秒

4)android.location.LocationListener接口,方法有:

  • void onLocationChanged(Location location):位置变化时调用
  • void onProviderDisabled(String provider):用户关闭provider时调用
  • void onProviderEnabled(String provider):用户开启provider时调用
  • void onStatusChanged(String provider, int status, Bundle extras):provider状态变化时调用,如GPS信号无法获得等

Android定位功能开发(1)——获取位置相关推荐

  1. Android定位功能开发(3)——地图服务(地图点与经纬度)

    基本的地图服务包括三项功能: 让地图显示某个经纬度位置: 获取地图上某个点的经纬度: 在地图上标注出某个位置. 要让地图显示某个经纬度位置,步骤是:获取BaiduMap对象.设置位置.动画显示. 代码 ...

  2. 基于百度地图实现Android定位功能实现(详解+教程)

    基于百度地图实现Android定位功能实现(详解+教程) 1.初始化 (一)获取到SHA1 (1)找到View中的Tool Windows并打开Terminal (2)找到你的jdk的bin目录,小编 ...

  3. 基于百度地图实现Android定位功能实现

    基于百度地图实现Android定位功能实现 初始化 一>获取SHA1 二>Android studio 配置 (1)下载百度地图sdk (2)解压安装包 (3)回到刚刚配置的jar包,右击 ...

  4. Android定位功能(二)

    在前文Android定位功能(一)中,已经大致介绍了一下在Android平台中,和定位功能相关的类,并举例获取了位置信息.但是前文是基于Criteria定制了一个标准,通过getBestProvide ...

  5. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  6. android 定位功能的实现

    在Android开发其中.常常须要用到定位功能,尤其是依赖于地理位置功能的应用.非常多人喜欢使用百度地图,高德地图提供的sdk.开放API,可是在只须要经纬度,或者城市,街道地址等信息.并不须要提供预 ...

  7. Android全球定位系统GPS实时获取位置-刘宇

    GPS是全球定位系统,他能够获取到你当前的位置.方向.速度.高度等信息,这样可以帮助我们实现很多功能,如获取当前位置等信息.距离计算.邻近报警等功能.下面我就带大家一起来简单实现第一个功能获取当前位置 ...

  8. Android 定位功能简单实现

    文章目录 背景 实现方式 实现关键代码 结果验证图示 背景 在个人 App:Hi朋友中完善天气查询功能时,需要定位用户当前所在的城市,需要用到手机的定位功能.让用户打开天气查询页时,能够自动定位当前所 ...

  9. js 调用android定位,利用native.js获取手机gps是否开启

    用原生Android的方法,native的方式调用. 先添加权限: 以下是我从原生的方式里copy出来的供参考 lm = (LocationManager) getSystemService(Cont ...

最新文章

  1. CVPR 2020 | 元学习人脸识别框架详解
  2. Python机器学习--回归
  3. 线程、协成、IO模型
  4. TCP 粘包半包 netty 编解码 三者关系
  5. html css:背景图片链接css写法
  6. oracle 流标和sql效率,Oracle 中流标使用实例
  7. Oracle 客户端 PLSQL 12.0.7 安装、数据导出、Oracle 执行/解释计划
  8. 云手机如何打破Wintel、Apple和Google的生态的垄断
  9. 量化交易 均线、金叉死叉计算与交易策略
  10. 前端开发工程师学习路线图(收藏版)
  11. 【Linux】制作U-Boot烧写镜像到SD卡的过程(上篇)
  12. Html5基本使用详解
  13. ZipFile 解压多个.zip压缩文件
  14. 大数据技能修炼的个人道场
  15. VectorCAST/C++在汽车电子C++代码测试的应用
  16. 山东省第五届ACM大学生程序设计竞赛 Colorful Cupcakes
  17. 摄影技巧分享之:如何拍好全家福
  18. 目标检测常用评价指标笔记
  19. SQLSERVER CDC相关
  20. Bzoj4627 [BeiJing2016]回转寿司

热门文章

  1. java string 最大长度是多少_String字符串的最大长度是多少?
  2. 【canny边缘检测】canny边缘检测原理及代码详解
  3. 实验吧——密码学之我喜欢培根
  4. Redis 底层数据结构
  5. html二级菜单的创建
  6. nprogress官网教程小记
  7. 关于mysql varchar类型的长度
  8. UI设计师在面试中问到频率最高的五个问题!
  9. IDEA EasyApi导出接口到Yapi返回的数据格式未解析问题
  10. 深入理解分布式技术 - 分布式系统中的缓存