针对部分设备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也不需要连接网线),这个
网线位置信息是网络隐私信息(被工信部管制)。