Android系统中包括3中定位模式:
使用GPS、WLAN和移动网络 | 使用WLAN和移动网络 | 仅使用GPS | |
---|---|---|---|
特点 |
同时使用GPS、WIFI及基站定位,速度快、精度高,室内定位效果好。 缺点:耗流量、耗电量 |
只使用WIFI和基站定位,需要WIFI或者基站才行,室内效果好。 缺点:依赖WIFI或基站,精度一般 |
不依赖WIFI和基站,室内效果差,户外可靠性好。 缺点:室内效果差 |
代码 | LocationManager.GPS_PROVIDER = true; LocationManager.NETWORK_PROVIDER = true; |
LocationManager.GPS_PROVIDER = false; LocationManager.NETWORK_PROVIDER = true; |
LocationManager.GPS_PROVIDER = true; LocationManager.NETWORK_PROVIDER = false; |
是否打开定位服务 | Settings.Secure.LOCATION_MODE = 3 | Settings.Secure.LOCATION_MODE = 2 | Settings.Secure.LOCATION_MODE = 1 |
Android系统中检查是否开启了定位服务的代码,参考如下:
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 32 33 34 35 36 37 38 |
/** * 获取设备是否支持GPS定位 * * @param context context * @return 如果设备上提供了GPS定位,返回 true ,否则返回false */ public static boolean hasGpsDevice(@NonNull final Context context) { final LocationManager lms = (LocationManager) context.getSystemService(android.content.Context.LOCATION_SERVICE); if (null != lms) { final List<String> providers = lms.getAllProviders(); if (null != providers) { return providers.contains(LocationManager.GPS_PROVIDER); } } return false; } /** * 检查设备是否开启了定位服务 * * @return 定位功能已经开启返回 true,否则返回false */ public static boolean isLocationEnabled(@NonNull final Context context) { final LocationManager lms = (LocationManager) context.getSystemService(android.content.Context.LOCATION_SERVICE); if (null != lms) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { return lms.isLocationEnabled(); } else { // 目前已知在OPPO Pad Android 11 版本上,设备本身没有GPS设备,此时如果检查GPS定位权限会持续返回 false // 导致用户没有办法使用设备,因此我们再没有GPS的设备上,默认直接判断网络定位功能有没有开启 if (hasGpsDevice(context)) { return lms.isProviderEnabled(LocationManager.GPS_PROVIDER) || lms.isProviderEnabled(LocationManager.NETWORK_PROVIDER); } return lms.isProviderEnabled(LocationManager.NETWORK_PROVIDER); } } return false; } |