【Android】位置修改相关

news2024/11/17 15:48:01

获取位置服务总开关状态

//获取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.coloradmin.cn/o/1492621.html

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

相关文章

嵌入式硬件设计实例:基于STM32的流水灯原理图和PCB设计

最近本来在忙别的事&#xff0c;大约忙到五一以后吧&#xff0c;没有时间研究一些深入的知识。本来想停更的&#xff0c;但是刚刚申请到博客专家&#xff0c;想想还是得更新点文章。这里就把一些以前我做过的一些简单的硬件设计拿来出来复习一下。 本篇文章就来介绍一下&#…

【论文翻译】结构化状态空间模型

文章目录 3.2 对角结构化状态空间模型3.2.1 S4D:对角SSM算法3.2.2 完整应用实例 3.3 对角化加低秩&#xff08;DPLR&#xff09;参数化3.3.1 DPLR 状态空间核算法3.3.2 S4-DPLR 算法和计算复杂度3.3.3赫尔维兹&#xff08;稳定&#xff09;DPLR形式 这篇文章是Mamba作者博士论文…

重量的定义、质量和重量之间的区别

一、简述 物体的重量取决于该物体所在空间点的引力场。重量是一种力&#xff0c;因此它是一个矢量&#xff0c;这意味着它有方向和大小。通过自由体图来表示物体重量产生的力通常很方便。 重量总是从物体的质心向下作用到地球中心。&#xff08;如果你在不同的天体上&#xff0…

万物皆可模块化分解

引言 为何要模块化&#xff0c;这里的主体是人&#xff0c;客体是事物。当事物很小时&#xff0c;人可以很轻松的解决&#xff1b;但是当事物远大于人能处理的范围时&#xff0c;我们就可以考虑对它进行模块化分解。模块化是一种解决复杂问题的方式&#xff0c;放之四海而皆可…

LVS集群(Linux Virtual server)相关介绍及LVS的NAT模式部署

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…

Nvm下载安装和基本使用

下载与安装 github地址&#xff1a;Releases coreybutler/nvm-windows (github.com) 默认安装&#xff1a;安装nvm时候&#xff0c;全默认即可&#xff08;如果自定义目录&#xff0c;切记 nvm的安装路径 &#xff1a;不要有汉字&#xff0c;不要有空格&#xff0c;不然后面会…

day04-SpringBootWeb入门

一、SpringBootWeb快速入门 1 需求 需求&#xff1a;基于 SpringBoot 的方式开发一个 web 应用&#xff0c;浏览器发起请求 /hello后&#xff0c;给浏览器返回字符串“Hello World ~”。 2 开发步骤 第1步&#xff1a;创建 SpringBoot 工程项目 第2步&#xff1a;定义 HelloC…

在 Rust 中实现 TCP : 3. TCP连接四元组

连接四元组 我们的项目已经取得了很大的进展——接下来能够开始解决 TCP 协议的实现问题。下面将讨论 TCP 的一些行为及其各种状态。 在多任务操作系统中&#xff0c;各种应用程序&#xff08;例如 Web 服务器、电子邮件客户端等&#xff09;需要同时进行网络访问。为了区分这…

使用GitOps自动化推动AI/ML工作流程

作为一名深耕自动化和人工智能领域的开发人员&#xff0c;我们逐渐认识到尖端工具和方法之间的显着协同作用&#xff0c;这些协同作用突破了可能性的界限。在这次探索中&#xff0c;我们想分享一个概念&#xff0c;它不仅彻底改变了我们的软件开发和基础设施管理方法&#xff0…

华为智慧教室3.0的晨光,点亮教育智能化变革

“教室外有更大的世界&#xff0c;但世界上没有比教室更伟大的地方。” 我们在求学阶段&#xff0c;都听说过这句话&#xff0c;但往往是在走出校园之后&#xff0c;才真正理解了这句话。为了让走出校园的孩子能够有能力&#xff0c;有勇气探索广阔的世界。我们应该准备最好的教…

JProfiler详解 JVM性能监测内存泄露分析工具

JProfiler详解 JProfiler简介主要功能特点使用场景注意事项使用案例使用步骤Could not verify ssh-ed25519 host key with fingerprint 问题解决内存泄露分析 JProfiler简介 JProfiler是一款业界领先的Java性能分析工具&#xff0c;由ej-technologies公司开发&#xff0c;专门…

Elasticsearch:使用 Streamlit、语义搜索和命名实体提取开发 Elastic Search 应用程序

作者&#xff1a;Camille Corti-Georgiou 介绍 一切都是一个搜索问题。 我在 Elastic 工作的第一周就听到有人说过这句话&#xff0c;从那时起&#xff0c;这句话就永久地印在了我的脑海中。 这篇博客的目的并不是我出色的同事对我所做的相关陈述进行分析&#xff0c;但我首先…

dolphinescheduler调用API

&#xff08;作者&#xff1a;陈玓玏&#xff09; 1. 打开api文档 api文档地址&#xff1a;http://{api server ip}:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn&#xff0c;我是用k8s部署的&#xff0c;所以ip和端口是由service决定的&#xf…

前端学习之HTML(第二天)--多媒体标签和表格标签

注&#xff1a;里面的注释是对各个标签的解释 多媒体标签 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title> </head> <body> <!-- audio是音频可以填写绝对路径也可填写相对路径 --> &l…

【Hadoop大数据技术】——Hadoop概述与搭建环境(学习笔记)

&#x1f4d6; 前言&#xff1a;随着大数据时代的到来&#xff0c;大数据已经在金融、交通、物流等各个行业领域得到广泛应用。而Hadoop就是一个用于处理海量数据的框架&#xff0c;它既可以为海量数据提供可靠的存储&#xff1b;也可以为海量数据提供高效的处理。 目录 &#…

CSS定位,web游戏开发

面试前的准备 在这部分&#xff0c;我将详细讲解面试前我们需要做哪些方面的工作&#xff0c;以保证我们在面试过程中更加顺利。 准备一份漂亮的简历 一份漂亮的简历就是你进入大厂的敲门砖。 网上有很多教程教大家如何写出一份漂亮的简历&#xff0c;这里我就不做重复劳动了…

【SpringBoot3.x教程02】SpringBoot配置文件详解

前言&#xff1a;什么是配置文件 SpringBoot的配置文件是指用于定义和管理SpringBoot应用程序配置的文件。这些配置文件允许开发者调整和控制应用程序的行为&#xff0c;而无需改变代码。主要有两种格式的配置文件&#xff1a; 1、application.properties&#xff1a;这是一种使…

JavaScript 闭包:让你更深入了解函数和作用域

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

修改表中某个字段等于另一个字段减去 2 小时的 SQL

需求&#xff1a;将表中到达时间按照客户要求改为比赛时间的提前 N 小时&#xff0c;具体如下&#xff1a; 表结构 update contestSchedule SET mainRefereeArrivalTimeDATE_FORMAT(CONCAT(2024-03-04 ,gameTime)- INTERVAL 2 HOUR, %H:%i), assistantRefereeArrivalTimeDAT…

streamlit初学-用streamlit实现云台控制界面

用streamlit实现云台控制界面 效果图PC上的效果手机上的效果 源码: 本文演示了,如何用streamlit做一个云台控制界面。功能包括:用户登录,事件的处理,图片的更新 版本信息: streamlit_authenticator: 下载链接streamlit : 1.31.1python: 3.11 修改点: streamlit_authenticato…