【Android】位置修改相关

获取位置服务总开关状态

//获取LOCATION_MODE值,但adb状态下无法获取
//0为关闭,1 gps、2 network、3 高精度等
int state = Settings.Secure.getInt(mContext.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);
//获取location_providers_allowed,adb状态下可以读取
String s = Settings.Secure.getString(mContext.getContentResolver(),"location_providers_allowed");

实现

Android5-8

修改Settings.Secure+发送广播

private void setLocationEnabled(Context context, int mode){int oldMode = Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_OFF);updateLocationMode(context, oldMode, mode);
}private boolean updateLocationMode(Context context, int oldMode, int newMode) {Intent intent = new Intent("com.android.settings.location.MODE_CHANGING");intent.putExtra("CURRENT_MODE", oldMode);intent.putExtra("NEW_MODE", newMode);context.sendBroadcast(intent, android.Manifest.permission.WRITE_SECURE_SETTINGS);return Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE, newMode);
}

Android9

@RequiresApi(api = Build.VERSION_CODES.P)
public static void setProviderEnabledForUser(Context context, String provider, boolean enabled){LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);try{Field field = UserHandle.class.getDeclaredField("SYSTEM");field.setAccessible(true);UserHandle userHandle = (UserHandle) field.get(UserHandle.class);Method method = LocationManager.class.getDeclaredMethod("setProviderEnabledForUser",String.class,boolean.class,serHandle.class);method.invoke(locationManager, provider, enabled, userHandle);}catch(Exception e){Log.e(TAG, "can not setProviderEnabledForUser:(" + provider +"," + enabled +")");}
}

Android10以上

@RequiresApi(api = Build.VERSION_CODES.Q)
public static void setLocationEnabledForUser(Context context, boolean enabled){LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);try{Field field = UserHandle.class.getDeclaredField("SYSTEM");field.setAccessible(true);UserHandle userHandle = (UserHandle) field.get(UserHandle.class);Method method = LocationManager.class.getDeclaredMethod("setLocationEnabledForUser",boolean.class,UserHandle.class);method.invoke(locationManager, enabled, userHandle);}catch(Exception e){Log.e(TAG, "can not setLocationEnabledForUser:(" + enabled +")");}
}

实例

关闭位置信息总开关:
在这里插入图片描述

public class LocationUtil {private static void updateLocationMode(Context context, int oldMode, int newMode) {Intent intent = new Intent("com.android.settings.location.MODE_CHANGING");intent.putExtra("CURRENT_MODE", oldMode);intent.putExtra("NEW_MODE", newMode);context.sendBroadcast(intent, android.Manifest.permission.WRITE_SECURE_SETTINGS);Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE, newMode);}/*** Settings.Secure.LOCATION_MODE_OFF // 关闭* Settings.Secure.LOCATION_MODE_SENSORS_ONLY // GPS only* Settings.Secure.LOCATION_MODE_BATTERY_SAVING // 降低GPS上报频率* Settings.Secure.LOCATION_MODE_HIGH_ACCURACY // 高精度*/public static void setLocationEnabled(Context context, int mode){int oldMode = Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.LOCATION_MODE,Settings.Secure.LOCATION_MODE_OFF);updateLocationMode(context, oldMode, mode);}
}

定位默认高精度

Android8.1版本

1.修改xml文件

地址:\SettingsProvider\res\values

<string name="def_location_providers_allowed" translatable="false">gps,network</string>

该种方法只针对于国内系统有效
注:当手动切换到低耗电模式时,重启后会自动开启高精度
当修改含有GMS的海外系统时,单纯修改xml字符串无效,会出现:
1).重启后生效
2).进安卓设置页面后恢复
3).恢复出厂设置后重置
排查原因
由于是海外系统,有gms
手动点进设置中切换时会有弹窗提示,所以需要在开机之后通过代码进行修改
应用需要满足:
1).系统应用
2).gms开机启动慢,所以选择在接收到开机广播后进行处理,在AndroidMainfest.xml中声明权限

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

网上查到都是在Launcher的onCreate进行延迟处理,但客户需求不打包UI,而且还要考虑到主题切换等操作,所以在对应的系统应用中添加,用广播处理是一样的。

2.修改java文件

adb获取为null,即用户没有手动更改过定位模式

adb shell settings get system location_mode_changed

注:需要手动切换后再次获取,看看该属性值是否有变化
若无变化,可参考文章:android 默认打开高精度定位模式,accept Improve location accuracy
在Android8.1中,LocationMode.java中有将location_mode_changed属性值进行改变,以达到判断用户手动设置

在开机广播进行处理

// 判断用户是否手动设置了定位模式
int mode = Settings.System.getInt(getContentResolver(), "location_mode_changed", 0); ContentResolver localContentResolver = getContentResolver();
ContentValues localContentValues = new ContentValues();
localContentValues.put("name", "network_location_opt_in");
localContentValues.put("value", 1);  
localContentResolver.insert(Uri.parse("content://com.google.settings/partner"), localContentValues);if(mode == 0){Settings.Secure.setLocationProviderEnabled(localContentResolver, "network", true);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.MongoDbHelper封装 /*** MongoDB Operation class* author HyoJung* date …

进程的奥德赛:并发世界中的核心概念与动态管理

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

力扣hot10---大根堆+双端队列

题目&#xff1a; 大根堆思路&#xff1a; 维护最大值&#xff0c;应该首先想到大根堆。C中对应着priority_queue&#xff0c;这里用pair<int,int>来记录对应的值和在nums中的索引。所以有priority_queue<pair<int,int>> q。在大根堆中&#xff0c;用q.top()…

【框架学习 | 第一篇】一篇文章读懂MyBatis

文章目录 1.Mybatis介绍1.1Mybatis历史1.2Mybatis特点1.3与其他持久化框架对比1.4对象关系映射——ORM 2.搭建Mybatis2.1引入依赖2.2创建核心配置文件2.3创建表、实体类、mapper接口2.4创建映射文件2.4.1映射文件命名位置规则2.4.2编写映射文件2.4.3修改核心配置文件中映射文件…

priority_queue 优先级队列

从大到小排序&#xff1b; #include<cstdio> #include<queue> using namespace std; priority_queue <int> q; int main() {q.push(10),q.push(8),q.push(12),q.push(14),q.push(6);while(!q.empty())printf("%d ",q.top()),q.pop(); }输出 14 1…

Linux基本命令

一、基本命令 修改mysql端口号 vim /etc/my.cnf云服务器ssh端口修改 vim /etc/ssh/sshd_config1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启1.2…

【python--读取文件夹下所有文件读取关键词】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python练习题 抽取关键词 抽取关键词 import os import json import pandas as pd# 指定文件夹路径和关键…

信息熵、KL散度、交叉熵、互信息、点互信息

信息熵 信息量 信息量是对信息的度量&#xff0c;衡量事件的不确定性&#xff0c;越小概率的事件发生了产生的信息量越大。我们应该用什么形式的函数表达信息量呢&#xff1f;除了随着概率增大而减少&#xff0c;这个函数还有具有以下性质&#xff1a; 如果有两个事件x和y彼…

STM32标准库——(18)Unix时间戳、BKP备份寄存器、RTC实时时钟

1.Unix时间戳 1.1 简介 32位有符号数所能表示的最大数字是2^32/2-1这个数是21亿多&#xff0c;这其实是有溢出风险的&#xff0c;因为目前到2023年时间戳已经计到16亿了&#xff0c;32位有符号数的时间戳会在2038年的1月19号溢出&#xff0c;64位的时间戳能存储的时间范围非常…

C++对象模型剖析(六)一一Data语义学(三)

Data 语义学&#xff08;三&#xff09; “继承” 与 Data member 上期的这个继承的模块我们还剩下一个虚拟继承&#xff08;virtual inheritance&#xff09;没有讲&#xff0c;现在我们就来看看吧。 虚拟继承&#xff08;Virtual Inheritance&#xff09; 虚拟继承本质就是…

Linux笔记--make

使用上一节的 main.c、add.c、sub.c文件进行编译&#xff0c;编译的过程有很多步骤&#xff0c;如果要重新编译&#xff0c;还需要再重来一遍&#xff0c;能不能一步完成这些步骤?将这些步骤写到makefile文件中&#xff0c;通过make工具进行编译 一个工程中的源文件不计其数&a…

java 获取项目内的资源/配置文件

【getResourceAsStream】是java中用于获取项目内资源的常用方法&#xff0c;能够返回一个数据流&#xff0c;从而允许我们读取指定路径下的资源文件。这个方法可以用来读取各种类型的资源文件&#xff0c;包括但不限于文本文件、图像文件、配置文件等。 要使用getResourceAsStr…

高端相亲婚恋平台有哪些?分享五款高端靠谱相亲交友软件

如今市场上的相亲软件越来越多&#xff0c;但很少有人能找到自己心仪的相亲软件。在选择相亲软件时&#xff0c;大家最看重的就是安全性和真实性&#xff0c;因此我想向大家分享几款我用过且觉得可靠的高端相亲软件&#xff0c;希望能得到你们的认可。 1、丛丛 这是我用的最久的…

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序&#xff0c;它在芯片启动的时候最先被执行&#xff0c;可以用来做一些硬件的初始化或者用作固件热更新&#xff0c;当初始化完成之后跳转到对应的…

LeetCode 热题 100 | 图论(二)

目录 1 基础知识 1.1 什么是拓扑排序 1.2 如何进行拓扑排序 1.3 拓扑排序举例 2 207. 课程表 3 210. 课程表 II 菜鸟做题&#xff0c;语言是 C 1 基础知识 1.1 什么是拓扑排序 含义&#xff1a;根据节点之间的依赖关系来生成一个有序的序列。 应用&#xff1a…

12:Logstash|Web日志实时分析

Logstash|Web日志实时分析 logstashlogstash工作结构安装Logstash编写logstash配置文件步骤一:codec类插件插件帮助手册Logstash input插件步骤一:file模块插件filter grok插件Web日志实时分析部署beats与filebeat步骤一:filter grok模块插件logstash 一个数据采集、加工处…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 &#xff0c; cAdvisor 目前的最新版本&#xff08;v0.39.0&#xff09;仍然只支持 cgroup v1&#xff0c;不支持 cgroup v2。因此&#…

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&…

做抖店月入百万还是会亏损?珠珠来告诉你,做抖店水到底有多深?

我是电商珠珠 抖店的热度一直只高不低&#xff0c;所以很多想要做的新手不知道抖店水的深浅&#xff0c;就一股脑的去做了。结果又是被扣保证金&#xff0c;又是被判定无货源违规的&#xff0c;最后灰头土脸的关了店。那些说做了十万十几万的&#xff0c;几百万的难道都是假的…