android 6.0 关于定位的那些坑

来源:互联网 发布:js中校验身份证合法性 编辑:程序博客网 时间:2024/05/21 19:34

      今天我们的客户反应一台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);

原创粉丝点击