Android系统中是否开启定位及定位模式的判断
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 |
注:上面的“代码”指的是执行结果,代码如下:
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系统中是否开启定位及定位模式的判断的更多相关文章
- android系统中如何通过程序打开某个AccessibilityService
android系统中如何通过程序打开某个AccessibilityService(系统辅助服务)? 通常的做法是注册AccessibilityService(辅助服务)后跳转到设置启动服务页面引导用户 ...
- Android系统中的6种模式
Android系统中的6种模式 1:一般启动模式(normal mode): 功能是正常启动手机,方法为关机状态下按电源键启动. 2:安全模式(safe mode): 此模式和正常启动一样 ...
- [原创]Android系统中常用JAVA类源码浅析之HashMap
由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...
- Android系统中的广播(Broadcast)机制简要介绍和学习计划
在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制:这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用:本文通过一个 ...
- Android系统中 setprop,getprop,watchprops命令的使用
如:在frameworks/opt/net/ims/src/java/com/android/ims/ImsManager.java if (SystemProperties.get("pe ...
- 用adb pull命令从android系统中读取文件失败的原因及解决办法
问题:使用adb pull命令从android系统中读取文件失败.显示:Permission denied 原因:是由于文件权限原因引起. 使用ls -l命令查看android系统中的 ...
- Android系统中的dp和px的转换
android系统中DP和SP的转化:1.首先分析TypedValue.java 可以调用以下代码获得dp的值 TypedValue.applyDimension(TypedValue.COMPLEX ...
- Android系统中设置TextView的行间距(非行高)
Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...
- Android 系统中运行jar文件
在android系统中运行jar操作步骤: 1. 打包编译jar包 2. 将jar包导入android设备中 adb push test.jar /data/local/tm ...
随机推荐
- spring-IoC的配置文件applicationContext.XML
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- js三种弹出框的用法
https://blog.csdn.net/cui_angel/article/details/7784211 js中prompt()的用法
- Python day 05
day05 数据类型 今日内容 字典 补充 .extend() users = [1,2,3,4] people = [5,6,7,8] users.extend(people) people.ext ...
- Java集合源码分析之ArrayList
ArrayList简介 从上图可以看到,ArrayList是集合框架中List接口的一个实现类,它继承了AbstractList类,实现了List, RandomAccess, Cloneable, ...
- 解决 ImportError: No module named _internal
参考: My pip is broken. _internal module cannot be imported. #5253 解决 ImportError: No module named _in ...
- JQurey 添加和删除元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...
- canvas 经典播放器图标
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- vjson.hpp
//vov #ifndef VJSON_HPP #define VJSON_HPP #include <iostream> #include <string> #include ...
- C#演示如何使用 XML 将源码编入文档
工作闲暇时间,将做工程过程中常用的代码段记录起来,下面的代码是关于C#演示如何使用 XML 将编入文档的代码,希望对大伙有较大帮助. using System; public class SomeCl ...
- PyQt5——布局管理
PyQt5布局管理使用方法详见:https://blog.csdn.net/jia666666/article/list/3?t=1& PyQt5布局管理汇总: 1.QHBoxLayout 2 ...