zoukankan      html  css  js  c++  java
  • Android系统中是否开启定位及定位模式的判断

    1、关于Android系统中不同的定位模式

    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

    注:上面的“代码”指的是执行结果,代码如下:

    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;
  • 相关阅读:
    Hive学习之路 (十二)Hive SQL练习之影评案例
    Hive学习之路 (十一)Hive的5个面试题
    Guava Files 源码分析(二)
    Guava Files 源码分析(一)
    观察者模式与Guava EventBus
    Guava 源码分析之 Beta, GwtCompatible, GwtIncompatible, Charset, HashCode
    Java IO的简单示例
    从volatile说到i++的线程安全问题
    乐观锁与悲观锁
    SimpleDateFormat的线程安全问题与解决方案
  • 原文地址:https://www.cnblogs.com/wlrhnh/p/7389930.html
Copyright © 2011-2022 走看看