smile908

导航

针对部分设备GPS开启状态异常的分析

针对部分设备GPS开启状态异常的分析

 

1:系统的源码分析

public static boolean getLocationState() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        LocationManager alm = (LocationManager) App.getContext().getSystemService(Context.LOCATION_SERVICE);
        if (!alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
            return false;
        } else {
            return true;
        }
    }
    return true;
}                       

在此代码中,判断了安卓版本大于10的设备,对于低于安卓10的设备,直接返回ture(开启gps),这样对于低版本的安卓设备肯定是有问题。而且,在大于安卓10的设备中(比如安卓12的oppo),代码里对于开启gps的判断只判断android.location.LocationManager.GPS_PROVIDER,也就是说,此判断只正对于安卓了gsp芯片的设备(绝大部分的手机),但是对于没有gps芯片的设备,就会出现问题。

 

2:总结

在Android中定位是属于危险权限,需要在添加Mainfest.xml中添加。

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

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

 

在项目中,判断用户手机的定位是否开启的接口如上述代码。对于安卓的LocationManager这个关于定位服务的

Api,在此次项目中,我们只需要获取用户位置信息的开启,而不去获取用户更多的信息,比如经纬度,城市等等因此,我们只使用LocationManager里面的isProviderEnabled(参数),里面的参数是安卓给我们提供的四种定位方式。分别是:

在Android系统当中,给我们提供了四种定位方式,分别是:

network:它是依靠信号塔或WiFi来定位的。对应的provider字段是LocationManager.NETWORK_PROVIDER,是一种低精度,低耗电的初略定位方式。

Gps:它是依靠GPS来定位的。对应的provider字段是LocationManager.GPS_PROVIDER,是高精度,高耗电的精准定位方式。

passive被动的获取定位信息,通过接受其他APP或service的定位信息。

Fused:Google已经将这个定位方式hide了。

 

 3:定位状态接口的更改

public static boolean getLocationState(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    if (gps || network) {
        return true;
    }
    return false;
}

我们加上了判断gps的第二种方式,通过网络获取用户的定位信息。而不是仅仅依赖gsp芯片。

同样是安卓12,手机和oppo平板获取定位信息的差别主要原因是平板没有gps芯片,只能通过网络进行定位。

通过查阅,国内大部分平板没有gps芯片,所以无法通过gps的方式来获取用户位置状态。不过,苹果的平板似乎有gps芯片。

 

4:不同的设备所支持的provider

 

此次实验使用了四款设备,分别是两款真机(小米8se,红米k30 pro)和两款虚拟机(pixel 5和Google Nexus)

以上设备支持的定位provider如下所示。

Google Nexus(两种)                                 pixel 5(三种)

小米8SE(三种)                                  红米K30 Pro(四种)

 

关于网络定位补充:如果设备是平板,大概率的provider只有两种,分别是network和passive。所以

Gps的provider一直是flase,基本上能用的只有network的provider,但是network的privider,只有

wifi 定位和手机自身网络可以返回ture,网线是不支持的(返回flase,vb800也不需要连接网线),这个

网线位置信息是网络隐私信息(被工信部管制)。

posted on 2022-11-25 16:29  smile908  阅读(302)  评论(0编辑  收藏  举报