smile908

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

针对部分设备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   smile908  阅读(311)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示