Android wifi的开关Settings值异常分析

Android wifi的开关Settings值异常分析

文章目录

  • Android wifi的开关Settings值异常分析
    • 一、前言
    • 二、异常分析
      • 1、adb或者串口获取Settings的wifi开关值
      • 2、代码获取wifi开关值
      • 3、根据日志分析代码
        • (1)logcat 对应的wifi开启日志的代码
          • ①WifiServiceImpl.java
          • ② WifiSettingsStore.java
      • 3、wifi_on不同的具体原因分析
    • 三、其他
      • 1、Android wifi的开关Settings值异常分析
      • 2、Android wifi热点开关代码记录
      • 3、Android13 Wifi启动流程分析

一、前言

有个项目需要通过开机后另外判断wifi的Settings属性值wifi_on进行wifi的一些处理。

但是使用同一个系统软件包,烧录在两个板载有点差异的设备上,发现打开wifi后两个设备的wifi_on的值居然不一样;
wifi开启状态一个显示为1;另外一个异常显示为2;
代码值中只判断了值为1的处理,导致有些逻辑未执行。

但是通过WifiManager获取wifi的开启状态,发现wifi又是开启的;
有点奇怪,想分析看看。

后面分析了一下系统的代码,有一些发现。
下面简单分享介绍一下。

二、异常分析

1、adb或者串口获取Settings的wifi开关值

settings get global wifi_on
1 //0 关闭,1开启,2?后续说明

2、代码获取wifi开关值

//(1)获取wifi Settings 的值:0、1、2
int wifi_on = 0;
final ContentResolver cr = context.getContentResolver();
try {wifi_on = Settings.Global.getInt(cr, Settings.Global.WIFI_ON, 0);
} catch (Exception e) {wifiSate = 0;
}
boolean isWifiGlobalEnabled = wifiSate == 1; //这样判断不准确!//(2)获取wifi开关的状态值:0、1、2、3
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
int wifiState = wifiManager.getWifiState();
Log.i(TAG," wifiState = " + wifiState + "(WIFI_STATE_DISABLING = 0;WIFI_STATE_DISABLED = 1;WIFI_STATE_ENABLING = 2;WIFI_STATE_ENABLED = 3;)");//(3)同时判断wifi_on 和wifi开关状态的值就比较准确了。
boolean isWifiEnable = isWifiGlobalEnabled || wifiState == WifiManager.WIFI_STATE_ENABLED;

两个属性都判断,只是我当时想到的规避手段;因为不清楚wifi_on=2的含义;
但是后面发现只要判断Wifi_on等于1或者2都可以表示开启。

3、根据日志分析代码

开机后logcat | grep WifiService 是可以看到wifi开启的日志的;
即使是wifi_on=2,wifi也是正常开启的;
那么就可以看看系统代码是如何判断的就可以了。

(1)logcat 对应的wifi开启日志的代码
①WifiServiceImpl.java

package\modules\Wifi\service\java\com\android\server\wifi\WifiServiceImpl.java

public class WifiServiceImpl extends BaseWifiService {private static final String TAG = "WifiService";//每次开机都会进入这里,检查wifi是否选开启public void checkAndStartWifi() {。。。// Check if wi-fi needs to be enabledboolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();//开机都会打印这个日志Log.i(TAG,"WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled"));}
}
② WifiSettingsStore.java

package\modules\Wifi\service\java\com\android\server\wifi\WifiSettingsStore.java

public class WifiSettingsStore {public static final int WIFI_DISABLED = 0;public static final int WIFI_ENABLED = 1;public static final int WIFI_ENABLED_APM_OVERRIDE = 2; //飞行模式public static final int WIFI_DISABLED_APM_ON = 3; //飞行模式,已经废弃...//判断wifi是否需要开启public synchronized boolean isWifiToggleEnabled() {return mPersistWifiState == WIFI_ENABLED|| mPersistWifiState == WIFI_ENABLED_APM_OVERRIDE;}
}

从系统代码中可以看到,系统代码里面是判断是wifi_on是否等于1或2 进行判断wifi是否需要开启的。

所以实际判断中也是可以判断1或2查看wifi是否开启的。

然后去那个wifi_on=2的设备查看原生设置,飞行模式果然是开启的状态。
所以真相大白了:wifi_on=2是 飞行模式下的wifi开启状态的值。

3、wifi_on不同的具体原因分析

从代码看就是因为一个设备默认开启了飞行模式。

但是我没设置啊,烧录后就这样!
为啥同一个系统软件,会有不同的显示问题?

下面是网上几个原因的参考:

安卓设备自动进入飞行模式的原因可能有多种,以下是常见原因及解决方法:
一、系统设置相关原因定时开启飞行模式原因:部分手机支持定时开启飞行模式(如 “睡眠模式” 或 “勿扰模式”),可能因误操作或设置到期触发。解决:进入手机 “设置” → “系统” → “日期和时间” 或 “高级设置”,检查是否开启了定时飞行模式。若开启,关闭该功能或调整时间设置。低电量自动切换原因:某些手机的 “省电模式” 会在电量过低时自动开启飞行模式以延长续航。解决:进入 “设置” → “电池”,关闭省电模式或调整省电策略。
二、应用程序或系统异常第三方应用权限滥用原因:部分应用(如任务管理、安全类应用)可能在后台误操作飞行模式开关。解决:进入 “设置” → “应用管理”,检查可疑应用的权限(如 “修改系统设置”),并关闭相关权限。尝试卸载近期安装的第三方应用,观察是否恢复正常。系统故障或软件 bug原因:系统版本存在兼容性问题或临时异常,导致飞行模式自动开启。解决:重启手机,清除缓存分区(需进入 Recovery 模式,具体方法因机型而异)。若问题持续,尝试将系统更新至最新版本或恢复出厂设置(备份数据后操作)。
三、硬件或物理按键问题物理按键误触或损坏原因:某些手机的飞行模式快捷键(如组合键)可能因误触或按键老化导致自动触发。解决:检查是否有按键卡住或异常,尝试清洁按键或联系售后维修。SIM 卡或网络异常原因:SIM 卡接触不良、信号弱或网络服务异常可能触发飞行模式作为保护机制。解决:重新插拔 SIM 卡,或更换其他 SIM 卡测试。进入 “设置” → “移动网络”,重置网络设置。
四、其他可能性开发者选项误操作原因:开启开发者选项中的某些调试功能(如 “模拟飞行模式”)可能导致异常。解决:进入 “设置” → “关于手机”,连续点击 “版本号” 关闭开发者选项(或手动关闭相关调试功能)。恶意软件或病毒原因:恶意软件可能篡改系统设置,强制开启飞行模式。解决:使用安全软件进行全盘扫描,卸载可疑应用。
总结排查步骤检查定时飞行模式设置。确认省电模式未触发飞行模式。检查第三方应用权限并卸载可疑应用。重启手机或更新系统版本。检查物理按键和 SIM 卡状态。恢复出厂设置(最后尝试,需备份数据)。若问题仍无法解决,建议联系手机厂商客服或前往售后检测。

我这边应该是硬件问题,异常情况的硬件的按键板是失效的。

三、其他

1、Android wifi的开关Settings值异常分析

默认模式和飞行模式下的wifi_on 值是不一样的;
默认模式wifi_on=1;飞行模式wifi_on=2;
所以判断wifi开关的时候判断wifi_on 等于1或者2才是准确的。

系统权限的应用或者硬件可能会导致进入飞行模式。

2、Android wifi热点开关代码记录

wifi和热点开关的代码可以用WifiManager也可以调用ConnectivityManager的接口实现。

https://blog.csdn.net/wenzhi20102321/article/details/145213735

3、Android13 Wifi启动流程分析

本文对Android13 wifi 开启流程进行梳理,有需要的可以看看。

如果遇到wifi 打不开问题,可以依照这个流程进行分析,看看具体是哪个流程出现问题。

https://blog.csdn.net/wenzhi20102321/article/details/135139360

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

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

相关文章

C#的委托Action

在 C# 中,Action 是一个预定义的委托类型,它位于 System 命名空间下。下面详细介绍它的作用和使用方法。 作用 Action 委托的主要作用是封装一个方法,这个方法没有返回值(即返回类型为 void)。它提供了一种简洁的方式…

Qt MainWindow简单例子(文本编辑)

使用Qt控件练习文本编辑窗口的创建。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLabel> #include <QProgressBar>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public Q…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…

织梦dedecmsV5.7提示信息提示框美化(带安装教程和效果展示)

一、效果展示 1、安装前效果 2、安装后效果 二、安装说明 1、安装测试版本&#xff1a;DedeCMS-V5.7.117-UTF8&#xff1b; 2、必须在修改代码之前请做好文件备份&#xff0c;以免误操无法恢复&#xff1b; 3、为了兼容其他版本&#xff0c;请在安装时&#xff0c;最好将替…

Science Advances 视触觉传感机制的交互装置,可以实时测量来自手不同部位的分布力

近日&#xff0c;由香港科技大学&#xff08;HKUST&#xff09;电子与计算机工程学系申亚京教授领导的研究团队&#xff0c;提出了一种基于数字通道的触觉交互系统&#xff0c;可以实时测量来自手不同部位的分布力&#xff0c;有望在医学评估、体育训练、机器人和虚拟现实&…

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

Vue调用子组件init方法时报错Cannot read properties of undefined (reading ‘init‘)解决方法

调用init方法语句写在this.$nextTick(() > {});方法里&#xff0c;因为nextTick方法在页面元素加载完之后调用 this.$nextTick(() > {this.$refs.chartComponent.init();});如果还报错&#xff1a;Error in nextTick: "TypeError: Cannot read properties of undef…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题&#xff0c;可以通过以下方法解决‌ ‌调整Finder设置‌&#xff1a; 打开Finder&#xff0c;点击“Finder”菜单&#xff0c;选择“偏好设置”。在偏好设置中&#xff0c;选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

从 Prop Drilling 到 Context:React 状态管理的演进与抉择

Context的出现解决了什么问题&#xff1f; Vue中的provide/inject和React中的Context非常相似&#xff0c;具体区别如下&#xff1a; 可以看到实际上最大的区别在于Vue是响应式&#xff0c;React是非响应式 那么context具体解决了什么问题&#xff1f;我们先看下面这个例子&a…

考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表

线性表的顺序存储结构 - 顺序表 1. 顺序表的定义 ​ 用一组地址连续的存储单元依次存储线性表的数据元素&#xff0c;从而使逻辑上相邻的两个元素在物理位置上也相邻 2. 顺序表的特点 随机访问&#xff1a; 即通过首地址和元素序号可以在O(1) 时间内找到指定元素&#xff0…

【经验分享】SpringBoot集成WebSocket开发02 之 实现一个基本示例并Spring Bean注入的方式来组织代码

结合Spring Boot和WebSocket实现一个基本示例&#xff0c;并且使用Spring Bean注入的方式来组织代码。 1. 创建Spring Boot项目 首先&#xff0c;确保你有一个Spring Boot项目&#xff0c;并在pom.xml文件中引入了WebSocket相关的依赖。 <dependencies><!-- Spring…

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理&#xff0c;并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易&#xff0c;我们还是在开篇介绍它的原理&#xff1a; Guava Cache 通过分段&#xff08;…

2025年【广东省安全员C证第四批(专职安全生产管理人员)】考试及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

安全生产是各行各业不可忽视的重要环节&#xff0c;特别是在广东省这样的经济大省&#xff0c;安全生产的重要性更是不言而喻。为了确保安全生产管理人员具备足够的专业知识和实际操作能力&#xff0c;广东省定期举办安全员C证考试。本文将详细介绍2025年广东省安全员C证第四批…

传输层自学

传输实体&#xff1a;完成传输层任务的硬件或软件 可能位于&#xff1a; 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能&#xff1a; 网络层与传输层作用范围比较&#xff1f; 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用&#xff1a;开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明&#xff08;游戏规则&#xff09;1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…

Spring Cloud Config - 动态配置管理与高可用治理

引言&#xff1a;为什么需要配置中心&#xff1f; 在微服务架构中&#xff0c;配置管理面临分散化、多环境、动态更新三大挑战。传统基于application.yml等配置文件的硬编码方式&#xff0c;导致以下问题&#xff1a; • 环境差异&#xff1a;开发、测试、生产环境配置混杂&a…

Git 常用命令指南

本文档旨在提供 Git 的常用命令及其使用示例&#xff0c;涵盖全局参数配置、获取本地仓库、基本概念、本地仓库操作、远程仓库操作和分支操作等内容。 1. 全局参数配置 Git 允许用户配置全局参数&#xff0c;以便在所有的仓库中共享这些设置。 <BASH> # 设置用户名 gi…