1、關於Android系統中不同的定位模式
Android系統中包括3中定位模式:
使用GPS、WLAN和移動網絡 | 使用WLAN和移動網絡 | 僅使用GPS | |
---|---|---|---|
截圖 | ![]() |
![]() |
![]() |
特點 | 同時使用GPS、WIFI及基站定位,速度快、精度高,室內定位效果好。 缺點:耗流量、耗電量 |
只使用WIFI和基站定位,需要WIFI或者基站才行,室內效果好。 缺點:依賴WIFI或基站,精度一般 |
不依賴WIFI和基站,室內效果差,戶外可靠性好。 缺點:室內效果差 |
代碼 | LocationManager.GPS_PROVIDER = true; |
LocationManager.GPS_PROVIDER = false; |
LocationManager.GPS_PROVIDER = true; |
是否打開定位服務 | Settings.Secure.LOCATION_MODE = 3 |
Settings.Secure.LOCATION_MODE = 2 |
Settings.Secure.LOCATION_MODE = 1 |
注:上面的“代碼”指的是執行結果,代碼如下:
1 Log.e("David", "GPS是否打開 " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)); 2 Log.e("David", "網絡定位是否打開 " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
2、判斷用戶是否打開系統定位服務
方法一:
下面的代碼,在API大於等於19時,返回的locationMode與用戶的選擇息息相關,如上圖。
當定位服務關閉時,Settings.Secure.LOCATION_MODE = 0;
1 public boolean isLocationEnabled() { 2 int locationMode = 0; 3 String locationProviders; 4 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 5 try { 6 locationMode = Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE); 7 } catch (Settings.SettingNotFoundException e) { 8 e.printStackTrace(); 9 return false; 10 } 11 return locationMode != Settings.Secure.LOCATION_MODE_OFF; 12 } else { 13 locationProviders = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 14 return !TextUtils.isEmpty(locationProviders); 15 } 16 }
方法二:
使用locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)和locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER),
有任何一個返回true,則可說明系統定位服務是開啟的。
3、判斷APP是否獲得定位權限
方法一:
使用如下代碼可判斷當前APP是否獲得定位權限,二者獲得其一即可認為獲得定位權限
1 checkPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION) 2 checkPermissionGranted(Manifest.permission.ACCESS_COARSE_LOCATION) 3 private boolean checkPermissionGranted(String permission) { 4 return this.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED; 5 }
方法二:
在API>=23的Android系統中,可以使用ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
方法三:
1 PackageManager pkgMgr = getPackageManager(); 2 return pkgMgr.checkPermission(permission, getPackageName()) == PackageManager.PERMISSION_GRANTED;
要注意的是,方法一和三在應用targetSdkVerison<23時,固定返回true,無論應用是否獲得授權。如果要在API<23時正常使用,建議使用如下方法四;
方法四:
使用系統提供的方法:
1 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;
這個方法在23前后都可以使用,但是最好是做版本判斷,大於等於23時使用ActivityCompat.checkSelfPermission(),其他的使用方法四。
4、跳轉到系統定位服務設置頁面
1 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;