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

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

 Log.e("David", "GPS是否打开 " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
Log.e("David", "网络定位是否打开 " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));

2、判断用户是否打开系统定位服务

方法一:

下面的代码,在API大于等于19时,返回的locationMode与用户的选择息息相关,如上图。

当定位服务关闭时,Settings.Secure.LOCATION_MODE = 0;

 public boolean isLocationEnabled() {
int locationMode = 0;
String locationProviders;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
locationMode = Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
return false;
}
return locationMode != Settings.Secure.LOCATION_MODE_OFF;
} else {
locationProviders = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
return !TextUtils.isEmpty(locationProviders);
}
}

方法二:

使用locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)和locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER),

有任何一个返回true,则可说明系统定位服务是开启的。

3、判断APP是否获得定位权限

方法一:

使用如下代码可判断当前APP是否获得定位权限,二者获得其一即可认为获得定位权限

 checkPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION)
checkPermissionGranted(Manifest.permission.ACCESS_COARSE_LOCATION)
private boolean checkPermissionGranted(String permission) {
return this.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;
}

方法二:

在API>=23的Android系统中,可以使用ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)

方法三:

 PackageManager pkgMgr = getPackageManager();
return pkgMgr.checkPermission(permission, getPackageName()) == PackageManager.PERMISSION_GRANTED;

要注意的是,方法一和三在应用targetSdkVerison<23时,固定返回true,无论应用是否获得授权。如果要在API<23时正常使用,建议使用如下方法四;

方法四:

使用系统提供的方法:

 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;

这个方法在23前后都可以使用,但是最好是做版本判断,大于等于23时使用ActivityCompat.checkSelfPermission(),其他的使用方法四。

4、跳转到系统定位服务设置页面

 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;

Android系统中是否开启定位及定位模式的判断的更多相关文章

  1. android系统中如何通过程序打开某个AccessibilityService

    android系统中如何通过程序打开某个AccessibilityService(系统辅助服务)? 通常的做法是注册AccessibilityService(辅助服务)后跳转到设置启动服务页面引导用户 ...

  2. Android系统中的6种模式

    Android系统中的6种模式 1:一般启动模式(normal mode):    功能是正常启动手机,方法为关机状态下按电源键启动. 2:安全模式(safe mode):    此模式和正常启动一样 ...

  3. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  4. Android系统中的广播(Broadcast)机制简要介绍和学习计划

    在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...

  5. Android系统中 setprop,getprop,watchprops命令的使用

    如:在frameworks/opt/net/ims/src/java/com/android/ims/ImsManager.java if (SystemProperties.get("pe ...

  6. 用adb pull命令从android系统中读取文件失败的原因及解决办法

    问题:使用adb pull命令从android系统中读取文件失败.显示:Permission denied   原因:是由于文件权限原因引起.       使用ls -l命令查看android系统中的 ...

  7. Android系统中的dp和px的转换

    android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...

  8. Android系统中设置TextView的行间距(非行高)

    Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...

  9. Android 系统中运行jar文件

    在android系统中运行jar操作步骤: 1.       打包编译jar包 2.       将jar包导入android设备中 adb push test.jar  /data/local/tm ...

随机推荐

  1. Tomcat每日报错

    本次针对tomcat端口占用所产生的8080:8009:8000报错 1.打开CMD命令提示符(win+R). 2.输入指令netstat str -ano|findstr 8080(8080这里可以 ...

  2. 结巴库及词频统计bb

    下面是利用云图和结巴库完成词频统计.代码如下: # -*- coding:utf- -*- from wordcloud import WordCloud import matplotlib.pypl ...

  3. ThreadLocal的意义和实现

    可以想像,如果一个对象的可变的变量被多个线程访问时,必然是不安全的. 在单线程应用可能会维持一个全局的数据库连接,并在程序启动时初始化这个连接对象,从而避免在调用每个方法时都传递一个Connectio ...

  4. vs编译过程中出的错

    如果运行时出现这样的错,关闭正在运行的.exe文件,即可正常运行

  5. Git设置文件或目录忽略跟踪的三种方式

    1. 共享的忽略设置方式 本地仓库根目录,创建.gitignore文件,并编辑正则匹配需要忽略的文件或目录. .gitignore文件需要上传到仓库,同时会影响到他人,共享忽略设置 注意: .giti ...

  6. SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较

    1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  7. 解决 Cannot uninstall 'pyparsing' 问题

    参考 pyparsing 无法卸载导致安装 matplotlib 出错 解决 Cannot uninstall 'pyparsing' 问题 在安装 pydot 时遇到依赖 pyparsing 无法更 ...

  8. 代码生成器——实现生成pojo,sql,mapper接口

    代码生成器(记录一次兴趣代码,多多指教.转载请标明作者) 在我们开始实现代码生成器之前我们先来对代码生成器有一个简单的了解. 1.什么是代码生成器? 故名思义,也就是生成代码的一个程序.那它是一个什么 ...

  9. 搜索引擎选择: Elasticsearch与Solr(转)

    搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分 ...

  10. php日志

    // 全局通用日志工具 function setlog($param = [],$result = [],$name='',$filename = 'm.log',$path = '/tmp/bear ...