扫码关注,一起学习

最近遇到一个新需求,成品如下,就是WiFi扫描界面增加一个选项,可以只扫描2.4G或者5G的AP。

方案一

/frameworks/opt/net/wifi/service/java/com/android/server/wifi/ScanRequestProxy.java
从代码里可以看到WiFi扫描默认是全扫描的,不会对 2.4G 和 5G 做筛选。

public boolean startScan(int callingUid, String packageName) {.............// always do full scanssettings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS;.............
}

下面是我的修改,frequencyBand 是写入数据库的标志位,UI 界面选择了以后改变这个数据,然后这里读取,再做相应的操作。关于Settings数据库的使用可以看 Settings数据库的使用 。

private static final String Ap_Frequency_Band = "ap_frequency_band";
public static final int WIFI_BAND_24_GHZ = 1;
public static final int WIFI_BAND_5_GHZ_WITH_DFS  = 6;
public static final int WIFI_BAND_BOTH_WITH_DFS = 7;public boolean startScan(int callingUid, String packageName) {.............int frequencyBand = Settings.Global.getInt(mContext.getContentResolver(), Ap_Frequency_Band, 0);switch (frequencyBand) {case WIFI_BAND_24_GHZ:settings.band = WifiScanner.WIFI_BAND_24_GHZ;break;case WIFI_BAND_5_GHZ_WITH_DFS:settings.band = WifiScanner.WIFI_BAND_5_GHZ_WITH_DFS;break;case WIFI_BAND_BOTH_WITH_DFS:settings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS;break;default:settings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS;break;}//settings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS;.............
}

这么做有一个弊端就是底层依然会扫描,但是上传到 framework 会根据 ScannerSettings 做筛选。这样的话如果你之前连过一个2.4G的AP,现在选择只扫描5G的AP,手机还是会自动重连到你之前保存过的那个2.4GAP,因为底层已经扫描到了。

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
下面是我在连接网络时做的处理,在连接AP时判断用户选择的频率扫描选项,如果用户选了5G,则连接网络时如果是2.4G的AP则直接返回空,不连接。这样就解决了上面的问题。

private void connectToNetwork(WifiConfiguration candidate) {ScanResult scanResultCandidate = candidate.getNetworkSelectionStatus().getCandidate();if (scanResultCandidate == null) {localLog("connectToNetwork: bad candidate - "  + candidate+ " scanResult: " + scanResultCandidate);return;}添加的代码:frequencyBand = Settings.Global.getInt(mContext.getContentResolver(), Ap_Frequency_Band, 7);if (!((frequencyBand == WIFI_BAND_24_GHZ && scanResultCandidate.is24GHz())|| (frequencyBand == WIFI_BAND_5_GHZ_WITH_DFS && scanResultCandidate.is5GHz())|| (frequencyBand == WIFI_BAND_BOTH_WITH_DFS))) {return;}}

方案二

frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java

后来就想能不能让底层扫描的时候就只扫描某个band的AP呢?结果找到了扫描时 framework 传给底层的参数中就有 freqs 参数,那我修改这个参数不就好了。一看代码果然是不区分,直接全扫描,如何就是修改,和UI通信的方式还是Settings数据库,上面说过了,这里不赘述。

原代码:

public boolean startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler) {synchronized (mSettingsLock) {boolean success = false;Set<Integer> freqs;if (!allFreqs.isEmpty()) {freqs = allFreqs.getScanFreqs();success = mWifiNative.scan(mIfaceName, settings.scanType, freqs, hiddenNetworkSSIDSet);if (!success) {Log.e(TAG, "Failed to start scan, freqs=" + freqs);}} else {}

channels 是有函数去获取2.4G或者5G对应的频率的,我们把这个写入 freq 就可以。

修改的代码:

public boolean startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler) {synchronized (mSettingsLock) {boolean success = false;修改的代码://Set<Integer> freqs;int[] channels = null;int[] channelDfs = null;int frequencyBand = Settings.Global.getInt(mContext.getContentResolver(), Ap_Frequency_Band, 7);Log.d(TAG, "Ap_Frequency_Band = " + frequencyBand);if (!allFreqs.isEmpty()) {//freqs = allFreqs.getScanFreqs();ArraySet<Integer> mChannels = new ArraySet<Integer>();switch (frequencyBand) {case WIFI_BAND_24_GHZ:channels = mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_24_GHZ);break;case WIFI_BAND_5_GHZ:channels = mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ);channelDfs = mWifiNative.getChannelsForBand(WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY);break;default:break;}if (null != channels){for (int chan : channels) {mChannels.add(chan);}if (null != channelDfs){for (int chan : channelDfs) {mChannels.add(chan);}}freqs= new ArraySet<Integer>(mChannels);} else {freqs = allFreqs.getScanFreqs();}Log.d(TAG, "freqs=" + freqs);

WiFI 扫描时选择固定频率(只扫2.4G或者5G的AP)相关推荐

  1. 怎么更改wifi频段_【wifi信号频率】wifi频率怎么设置 wifi2.4g和5g哪个更好

    wifi频率怎么设置 1.打开浏览器,输入192.168.1.1,进入路由设置界面. 2.单击左侧的设置向导,然后单击下一步. 3.一般情况,选择让路由器自动选择上网方式. 4.输入你从运营商那里获得 ...

  2. 关于Mac共享WiFi网络,看这里就够了(2 4G,5G , ipv6)

    前言: WiFi这个词大家都不陌生,前几年移动互联网的飞速发展,如今家家户户都有无线路由器,都有自家的WiFi.但是总有一些场景,我们需要WiFi网络来给我们的移动设备使用,但是现场有没有相关的硬件设 ...

  3. python判定固定时长固定频率的音频是否连续

    我有一段时长大约为3.34 s 频率为1khz 的连续音频.该音频输入一个设备,经转换输出后,我想判断该音频是否还连续. 好了,这就是我的需求,看起来比较棘手,但我们稍稍了解音频采样率,码流,音频格式 ...

  4. wifi的 2.4G 和5G

    1. 简介 wifi信号是通过无线电波传输的,2.4G和5G是两个不同的频段,WiFi信号就在这样的频段内进行传输. 频段,是一个有关波和通讯方面的词语. 在机械波中,频段是指声音频率和波长而言,人耳 ...

  5. 006.西门子M440变频器固定频率直接选择+ON命令

    西门子M440变频器固定频率直接选择+ON命令

  6. Android-O wifi扫描机制及功耗优化

    一. Android O wifi扫描场景 Android O上的wifi扫面场景可以归结为以下四种: 1. 亮屏情况下,在Wifi settings界面,固定扫描,时间间隔为10s. 2. 亮屏情况 ...

  7. android wifi 扫描频率,Android WIFI扫描时延

    希望大家能够给个评论,支持下新人,感激不尽. 本文第一篇CSDN博客,欢迎大家关注,如有错误,欢迎批评指正. 本人在做WIFI室内定位时发现Android扫描WIFI的时延不小.在此先附上我扫描wif ...

  8. Android wifi扫描机制(Android O)

    版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/h784707460/article/details/79658950,未经博主允许不得转载. 一. Android ...

  9. Android WIFI扫描时延

    希望大家能够给个评论,支持下新人,感激不尽. 本文第一篇CSDN博客,欢迎大家关注,如有错误,欢迎批评指正. 本人在做WIFI室内定位时发现Android扫描WIFI的时延不小.在此先附上我扫描wif ...

最新文章

  1. Rocksdb 的 MergeOperator 简单使用记录
  2. VM结构、GC工作机制详解
  3. open session and Hibernate事务处理机制
  4. 怎样使用Mendeley高效地管理中文文献
  5. 《软件测试方法和技术》 读书笔记
  6. 名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...
  7. webpack整体了解
  8. angularjs1.X进阶笔记(3)——如何重构controller
  9. 15.【nuxt起步】-Nuxt使用jsweixin sdk
  10. APP,webapp 设计相关资料汇集区
  11. 记录mikrotik路由器的折腾过程
  12. python代码案例详解-Python代码样例列表
  13. 2.10 分块矩阵求逆
  14. java休闲游戏背景音乐推荐_休闲益智类游戏背景音乐推荐
  15. 手机显示器云服务器,不想买台式机,手机加显示器组成云电脑是否可行?
  16. 期货开户需要具备⼀定的条件
  17. 视频:说话的艺术-与斯科特·汉塞尔曼(Scott Hanselman)
  18. 用Unity实现景深效果
  19. 朗润国际期货:去中心化稳定币谁能笑到最后?
  20. VX Search Client 9.7.18 漏洞分析及利用

热门文章

  1. 卫片图斑_推进土地卫片图斑整治工作
  2. Ae488 4K高科技数字识别触摸屏幕ui元素动画钢铁侠模块化hud图形用户界面ae模板
  3. oracle实验和代码
  4. 专访实在智能孙林君:颠覆传统RPA的实在IPA模式,如何做到真正人人可用?
  5. 深度 | AI芯片终极之战
  6. 读《活在网络里 大升级时代的人类新进化》
  7. Discuz!教程之应用中心安装插件提示“数据下载错误(105)”的解决办法
  8. 新美大和阿里本地生活的竞争趋势是如何的?
  9. Cisco Nexus vPC之Sticky Master
  10. [资源] Visual Studio 2015正式版离线iso及在线下载,附专业版和企业版可用key!