Android获取定位权限,获取设备所在的经纬度

转载请标明出处:http://77blogs.com/?p=253

前言:

有时候我们仅仅是想要获取设备所在的经纬度,那么直接调用Android相关的api就可以了,不需要去接入高德地图或者谷歌地图等等。

一、获取定位服务

二、获取所有可用的位置提供器

三、判断可用的位置提供器类型,是网络定位,还是GPS定位,若是都没有,那么就跳转至设置界面,提示打开网络和GPS定位服务

这里说一下两种定位的区别:

通过GPS定位,较精确,也比较耗电,而网络定位精度不高,省电。

四、获取Location

五、监视地理位置变化

这里设置3秒监听一次

六、实现地理位置变化接口

注意:

要在文件清单里面写上

我为此写了个工具类。

这里边涉及到了另一个问题,获取权限

对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录、短信等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。

 

新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。

 

对于Dangerous Permission,我们需要动态获取权限,那么我们怎么动态定位权限呢?

在activity中(其实我们可以把权限的获取写在一个BaseActivity中)我们可以这么做:

1、判断版本,如果6.0以下,那么便不需要获取权限。

2、若是6.0以及以上的话,那么便去判断是否已经授权,若是没有授权,那么便会去申请授权。若是已经授权,那么便直接执行我们的操作。

(判断之后若是没有授权,会弹出系统对话框询问是否同意授权,该对话框不可定制。)

3、授权回调。询问是否同意授权的时候,系统会弹出对话框,我们选择之后,会进行回调。在回调里面进行判断。

若是同意了,那么便可以直接执形我们的操作,若是不同意,那么下次依旧会弹出询问的对话框。不过这个对话框与之前比起来多了一个选项,那就是“不再提醒”(第一次询问没有这个选项)。这就难办了,若是点击了不再提醒,那么以后就不会再弹出对话框了,唉,那我们怎么判断呢?

Google给我们提供了一个方法:

该方法主要是为了给用户提供解释。

这个方法,在没弄明白之前,也是挺烦人。弄明白之后就好办了,那么,我们需要弄明白它的返回值。

(1)、当用户第一次被询问是否授权的时候,该方法返回值为false

(2)、若是用户上一次拒绝授权,但是没有点击“不再提醒“”的时候,这一次返回true。(我们可以根据这个判断,在这一次给用户一个解释,解释为什么该app需要该权限)

(3)、当用户上一次拒绝授权,并且点击了“不再提醒”的时候,那么返回false。

(4)、当用户在设置界面手动关闭了该APP的权限,那么也返回false。

 

那么,就出现了一个问题,这么多种情况都返回false,那么我们要怎么判断是哪一种情况呢?

比如第一与第三种情况。

若是我们在进行权限判断之前调用这个方法:

若是返回true,说明是第二种情况,需要给用户一个解释(我们可以给出一个对话框,点击确定后再执形检测权限的操作,即下面的的操作)。

若是返回false,那么到底是第一还是第三种情况。我们无法判断。这里我给出一种方法:在授权回调里面去检测,如下。

else可以说明已经拒绝授权。

然后调用shouldShowRequestPermissionRationale方法,若是返回false,说明

1、点击了“不再提醒”。

2、该app本身没有权限,被关闭。

那么我们就可以提醒用户去设置界面手动开启权限。