Android wifi的开关Settings值异常分析

ops/2025/3/17 9:24:33/

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.ppmy.cn/ops/166448.html

相关文章

精准捕捉各类声音并转换文字的工具

在日常的工作、学习以及娱乐场景中,我们常常有将语音快速转换为文字的需求,比如观看无字幕视频、整理会议录音等。今天要给大家安利一款超实用的软件——TMSpeech。 TMSpeech 是一款完全免费的绿色软件,解压后,只需双击“TMSpeech…

Modbus转换秘籍:力控组态软件的高效应用

Modbus转换秘籍:力控组态软件的高效应用 在工业自动化领域,Modbus协议以其简单、高效的特点被广泛应用。然而,由于不同的历史发展阶段和应用场景,Modbus协议衍生出了多种变种,其中Modbus RTU和Modbus TCP是最为常见的…

如何设置爬虫的延时避免被封禁

在使用爬虫获取数据时,合理设置延时是避免被目标网站封禁的关键策略之一。以下是一些常见的方法和技巧: 一、使用 time.sleep() 设置固定延时 time.sleep() 是 Python 中最常用的延时方法,可以在每次请求之间设置固定的延时,从而…

蓝桥杯15届省C

洛谷P10904挖矿 #include<bits/stdc.h> using namespace std; int n, m; const int N 2000010; int l[N], r[N]; int cnt; int main(){cin >> n >> m;for(int i 1; i < n; i){int x; cin >> x;if(x > 0){r[x];}else if(x < 0){l[-x];}else…

HTML 属性

HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 属性实例 HTML 链接由 <a> 标签定义。链接的地址在 href 属性中指定&#xff1a; <…

ospf单区域

OSPF单区域是指将整个自治系统&#xff08;AS&#xff09;内的所有路由器划分到同一个逻辑区域&#xff08;Area 0&#xff0c;即骨干区域&#xff09;中运行的OSPF协议模式。以下是其核心要点&#xff1a; 一、定义与核心特点 ‌区域统一性‌ 所有路由器均属于同一区域&…

HTML 基础夯实:标签、属性与基本结构的学习进度(一)

一、开启 HTML 学习大门 在当今数字化时代&#xff0c;网页已成为信息传播和交互的重要载体 &#xff0c;而 HTML 作为构建网页的基石&#xff0c;其重要性不言而喻。HTML&#xff0c;即超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;它定义了…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…