欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android 6.0 关于定位的那些坑

程序员文章站 2022-03-09 21:46:32
...

      今天我们的客户反应一台android设备获取不到定位,我立刻乘车到客户公司调查,原因是android系统的定位服务被关闭了。

      针对此事件,我查阅了谷歌文档。定位服务,是android 6.0及以上系统才有功能。

      定位服务简介:通常将各种不同的定位技术称为位置服务或定位服务。这种服务是通过电信运营商的无线电通信网络(如GSM网、CSMA网等)或外部定位方式(如GPS)来实现的。Android提供了对移动数据(cell tower,也叫蜂窝发射塔)、无线网络(Wi-fi)、全球定位系统(GPS)等多种定位技术的访问。

      例如,你编写的应用程序希望使用GPS定位,但是手机的位置服务可能处于关闭状态,这种情况下,实际上是无法获取到位置的,连一个粗略的位置都没有。该提供程序返回null,如果是百度定位sdk,返回就是167,无定位权限访问。就是我遇到的这种问题。

      位置服务,需要授予两个权限才能访问,官方描述如下:

ACCESS_COARSE_LOCATION

added in API level 1
String ACCESS_COARSE_LOCATION

Allows an app to access approximate location. Alternatively, you might want ACCESS_FINE_LOCATION.

Protection level: dangerous

Constant Value: "android.permission.ACCESS_COARSE_LOCATION"


ACCESS_FINE_LOCATION

added in API level 1
String ACCESS_FINE_LOCATION

Allows an app to access precise location. Alternatively, you might want ACCESS_COARSE_LOCATION.

Protection level: dangerous

Constant Value: "android.permission.ACCESS_FINE_LOCATION"


ACCESS_LOCATION_EXTRA_COMMANDS

added in API level 1
String ACCESS_LOCATION_EXTRA_COMMANDS

Allows an application to access extra location provider commands.

Protection level: normal

Constant Value: "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"

 看懂英文的就知道为什么是3个权限了哈。

 其次,我们的应用如何检查定位服务是否打开?谷歌也说了,定位服务是一种特殊类型的由Android系统管理的服务。系统服务总是与设备的硬件进行交互,并总是处于运行状态。在应用程序中,可利用ILocationListener与LocationManager类来访问定位服务。具体来说,要利用Android Location Service获取用户的位置,需要完成下面的步骤:

  • 获取对LocationManager类的引用。
  • 使用LocationManager请求提供程序更新位置
  • 当位置发生改变时,在实现的ILocationListener接口中处理位置信息。
  • 当应用程序转入后台时停止位置更新。
要在应用程序中获取位置更新的数据,需要先获取对LocationManager的引用,然后再调用RequestLocationUpdates()方法获取位置服务提供的更新数据。

  所以,我们需要使用LocationManager来判断是否开启位置服务。

 如果没有开始位置服务,我们可以跳转到开启位置服务的页面,代码如下:

Intent locationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(locationIntent);