【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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty(1)nio

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 st…

多平台拼音输入法软件的开发

拼音输入法从上个世纪发展到现在, 已经发展了几十年了, 技术上已经非常成熟了. 换句话说, 就是实际上没多少技术含量, 随便来个人就能手搓一个. 本文介绍一个简单的多平台拼音输入法软件的设计和实现, 支持 GNU/Linux (ibus) 平台 (PC) 和 Android 平台 (手机). 目录 1 中文输…

JVM(类加载机制)

类加载就是 .class 文件, 从文件(硬盘) 被加载到内存(元数据区)中的过程 类加载的过程 加载: 找 .class 文件的过程, 打开文件, 读文件, 把文件读到内存中 验证: 检查 .class 文件的格式是否正确 .class 是一个二进制文件, 其格式有严格的说明 准备: 给类对象分配内存空间 (先在…

[数据集][目标检测]鸡蛋破蛋数据集VOC+YOLO格式792张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;792 标注数量(xml文件个数)&#xff1a;792 标注数量(txt文件个数)&#xff1a;792 标注类别…

OpenDDS 在 Windows 上的编译环境部署指南

目录 1、OpenDDS2、编译OpenDDS2.1、准备工作2.2、配置环境变量2.3、编译-TAO_IDL_ACE2.4、编译-TAO_ACE2.5、编译-ACE2.7、生成OpenDDS的解决方案2.8、编译-DDS_no_test2.9、编译-DDS 1、OpenDDS OpenDDS是使用C语言针对OMG数据分发服务(DDS)的一种开源实现。由OCI公司设计和…

07. Nginx进阶-Nginx负载均衡

简介 负载均衡 什么是负载均衡&#xff1f; 负载均衡&#xff0c;英文名称为Load Balance&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行。 Nginx负载均衡 什么是Nginx负载均衡&#xff1f; Nginx负载均衡可以大…

Kubernetes 二进制部署 《easzlab / kubeasz项目部署》- 00-规划集群和配置介绍(二)

Kubernetes 二进制部署 - easzlab / kubeasz项目部署 00-规划集群和配置介绍1.首先创建集群配置实例2. 修改配置文件 在前一章&#xff0c;我们部署了一些基本环境&#xff0c;服务器&#xff0c;接下来&#xff0c;我们开始部署k8s相关组件 server list 类型IP主机名VIPgitl…

STM32 TIM编码器接口

单片机学习&#xff01; 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时…

WebGIS开发0基础必看教程:地图瓦片在Canvas上的拼接显示

1.前言 在之前的五个章节中&#xff0c;我们在第一章节里介绍了WebGIS的基本框架和技术&#xff0c;第二章节里介绍了什么是瓦片行列号以及计算它的原因&#xff0c;第三章节里介绍了如何通过地理范围计算出这个范围内瓦片的行列号&#xff0c;第四和第五章节里介绍了在得到瓦…

如何让 JOIN 跑得更快?

JOIN 一直是数据库性能优化的老大难问题&#xff0c;本来挺快的查询&#xff0c;一旦涉及了几个 JOIN&#xff0c;性能就会陡降。而且&#xff0c;参与 JOIN 的表越大越多&#xff0c;性能就越难提上来。 其实&#xff0c;让 JOIN 跑得快的关键是要对 JOIN 分类&#xff0c;分…

C++max函数的使用案例20个

文章目录 1. **基本用法&#xff1a;**2. **比较浮点数&#xff1a;**3. **比较字符串&#xff1a;**4. **使用自定义比较函数&#xff1a;**5. **比较容器中的元素&#xff1a;**6. **使用std::initializer_list&#xff1a;**7. **变长参数版本&#xff08;C11及以上&#xf…

c++的队列的用法

基本介绍 c的队列就是std::queue。 需要包含的头文件&#xff1a; #include<queue>queue就是先进先出队列 queue,就是队列&#xff0c;队列是一种容器适配器&#xff0c;专门设计用于在FIFO上下文中操作(先进先出)&#xff0c;其中将元素插入容器的一端并从另一端提…

广东Lenovo SR588服务器维修升级硬盘内存

本案例描述了对联想SR588服务器进行硬件升级的过程&#xff0c;包括更换固态硬盘作为系统盘&#xff0c;以及增加内存容量至128GB。升级后&#xff0c;服务器性能得到显著提升&#xff0c;同时通过重新配置RAID阵列和操作系统的重新安装&#xff0c;确保了系统的稳定性和数据的…

华为路由器 三层交换实现vlan通信 实验(附ensp实验源文件)

一、目标 通过三层交换实现vlan通信 二、网络配置 2.1 交换机1&#xff08;LSW1&#xff09;配置 # 创建两个vlan vlan 10 vlan 20# 配置g0/0/1端口 port link-type access port default vlan 10# 配置g0/0/2端口 port link-type access port default vlan 20# 配置g0/0/3端口…

STM32F1 - SPI读写Flash

Serial peripheral interface 1> 实验概述2> SPI硬件框图初始化程序 3> STM32的SPI通信时序3.1> 时序图3.2> 文字描述3.3> 注意事项3.4> 流程图表示3.5> 程序表示接收程序&#xff1a;发送程序&#xff1a; 4> SPI的4种模式5> W25Q128存储结构块…

开发知识点-Python-爬虫

爬虫 scrapybeautifulsoupfind_all find祖先/父节点兄弟节点nextpreviousCSS选择器属性值 attrsselect 后 class 正则使用字符串来描述、匹配一系列符合某个规则的字符串组成元字符使用grep匹配正则组与捕获断言与标记条件匹配正则表达式的标志 特定中文 匹配 scrapy scrapy内…

ssm+springboot音乐播放器网站mybatis+jsp

测试流程 &#xff08;1&#xff09; 登录系统、填写用户名、密码选择角色&#xff0c;主要内容&#xff1a;进行权限控制。 &#xff08;2&#xff09; 用户查看音乐信息、音乐资讯功能&#xff0c;主要是测试系统实用性、方便性。 &#xff08;3&#xff09; 信息修…

B084-SpringCloud-Zuul Config

目录 zuul系统架构和zuul的作用zuul网关实现配置映射路径过滤器 Config概述云端管理本地配置 zuul zuul是分布式和集群后前端统一访问入口 系统架构和zuul的作用 zuul把自己注册进eureka&#xff0c;然后可通过前端传来的服务名发现和访问对应的服务集群 为了预防zuul单点故…

在Java中处理JSON数据:Jackson与Gson库比较

引言 JSON&#xff0c;作为一种轻量级的数据交换格式&#xff0c;因其易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;而被广泛应用于网络通信和配置文件中。在Java中&#xff0c;有两个强大的工具帮助咱们处理JSON数据——Jackson和Gson。这两个库各有千秋…

Conda 快速入门,轻松拿捏 Python

一、简介 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows&#xff0c;也可以打包和分发其他软件&…