可以根据自己需求对部分信息进行修改。
编译系统后,直接打开热点就是按照上面的配置信息传给底层的;
应用调用了设置热点配置方法,配置信息也是会保存到 WifiConfigStoreSoftAp.xml 文件的,
后续热点打开都是 WifiConfigStoreSoftAp.xml 的配置信息。
下面的是特殊场景,设置特定热点配置信息,
不管本地配置文件和应用怎么设置,最终热点都是以特定的配置打开。
3、代码中强制设置配置信息
不管应用怎么设置,系统实际生效都是特定的配置,
虽然现实中可能这样的场景比较少,但是万一有呢?
所以还是给大家介绍一下。
(1)在关键流程设置
热点开启和关闭代码:
ConnectivityManager mConnectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//开启
mConnectivityManager.startTethering(ConnectivityManager.TETHERING_WIFI, true,
mOnStartTetheringCallback, new Handler(Looper.getMainLooper()));
//关闭
mConnectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI);
如果需要实现这个就要对Android 热点设置的流程 比较熟悉了,具体在哪个类进行适配可以呢?
热点启动流程
(1)ConnectivityManager.startTethering
(2)TetheringManager.startTethering(request, executor, tetheringCallback)
(3)TetheringService.TetheringConnector.startTethering
(4)Tethering.startTethering(request, listener);
//方法名变化,使用null 对象开启热点
(5)WifiManager.startTetheredHotspot(null /* use existing softap config */)
(6)WifiServiceImpl.startTetheredHotspot(@Nullable SoftApConfiguration softApConfig)
//方法名再变化
(7)ActiveModeWarden.startSoftAp(apModeConfig);
(8)ActiveModeManager.start();
ActiveModeManager manager = mWifiInjector.makeSoftApManager(listener, callback, softApConfig);
listener.setActiveModeManager(manager);
manager.start();
ActiveModeManager是接口类,会调用到SoftApManager.start()
(9)SoftApManager.startSoftAp()
(10)WifiNative.startSoftAp(mApInterfaceName, localConfigBuilder.build(), mSoftApListener)
(11)HostapdHal.addAccessPoint(ifaceName, config, listener::onFailure)
(12)根据硬件版本调用不同的接口实现:addAccessPoint_X_X
从上面流程看热点开启是不需要参数的,后续SoftApManager里面会获取默认参数,综合观察发现WifiNative 前面强制处理最好。
packages\modules\Wifi\service\java\com\android\server\wifi\SoftApManager.java
热点启动关键流程:
//(1)开启wifi的重要过程
//mCurrentSoftApConfiguration 的信息是构造方法从配置文件中获取的
private int startSoftAp() {
Log.d(getTag(), "startSoftAp: band " + mCurrentSoftApConfiguration.getBand()
- " iface " + mApInterfaceName + " country " + mCountryCode);
//(2)这里强制设置 mCurrentSoftApConfiguration 的配置参数
//强制设置5G,48信道
boolean isDefault5G_48 = SystemProperties.getBoolean(“persist.sys.mydebug.hotspot_default_5G_48”, true);
Log.d(TAG, "getApConfiguration isDefault5G_48 = " + isDefault5G_48);
if (isDefault5G_48) {
mCurrentSoftApConfiguration = new SoftApConfiguration.Builder(mCurrentSoftApConfiguration)
.setChannel(48, SoftApConfiguration.BAND_5GHZ).build();
}
int result = setMacAddress();
if (result != SUCCESS) {
return result;
}
。。。
mWifiDiagnostics.startLogging(mApInterfaceName);
mStartTimestamp = FORMATTER.format(new Date(System.currentTimeMillis()));
//(3)热点开启成功的标志
Log.d(getTag(), "Soft AP is started ");
return SUCCESS;
}
验证ok,打开热点默认是是5G 频段,48信道。
而且不管默认配置方法怎么设置,配置文件参数写什么,最终都都是以上面的信息开启的热点。
(2)在获取配置信息方法强制设置并返回,是否ok?
packages\modules\Wifi\service\java\com\android\server\wifi\WifiApConfigStore.java
public synchronized SoftApConfiguration getApConfiguration() {
if (mPersistentWifiApConfig == null) {
/* Use default configuration. */
Log.d(TAG, “Fallback to use default AP configuration”);
persistConfigAndTriggerBackupManagerProxy(
updatePersistentRandomizedMacAddress(getDefaultApConfiguration()));
}
SoftApConfiguration sanitizedPersistentconfig =
sanitizePersistentApConfig(mPersistentWifiApConfig);
…
//强制设置5G,44信道
boolean isDefault5G_44 = SystemProperties.getBoolean(“persist.sys.mydebug.hotspot_default_5G_44”, true);
Log.d(TAG, "getApConfiguration isDefault5G_44 = " + isDefault5G_44);
if (isDefault5G_44) {
return new SoftApConfiguration.Builder(mPersistentWifiApConfig)
.setChannel(44, SoftApConfiguration.BAND_5GHZ).build();
}
return mPersistentWifiApConfig;
}
其实这里修改看起来不保险?
因为设置一次参数后,系统保存的 mSoftApConfiguration 已经被修改了数据,
重新get是否可以获取到这里的固定的配置信息?
但是想想又可以哦。不管新的对象还是旧的对象都是调用这个方法。set啥都没用?
实际测试是ok 的,打开热点默认是是5G 频段,44信道。
而且不管默认配置方法怎么设置,配置文件参数写什么,最终都都是以上面的信息开启的热点。
如果上面第一种和第二种方式都修改呢?
这不是脱裤子放屁,搞事情吗?
其实是以第一种方式为准,因为 SoftApManager 的构造方法调用了getApConfiguration方法,
后续才调用 startSoftAp,最终数据以后面设置的算数。
最后来对比一下第一种和第二种强制设置配置信息的区别:
1、第一种是关键流程设置固定信息,比较靠谱
2、第二种是获取参数配置返回固定信息,但是系统可能多个地方都会调用到,会增加不确定性,需要一定的压测
3、第一种方式的修改后用户获取到的热点配置信息是不对的,用户还是获取配置文件的或者getApConfiguration方法的信息
4、第二种方式的修改后用户获取到的热点配置信息是正确的,是和实际配置的信息是一致的,虽然和保存在本地文件的信息不一定一致
所以要增加可靠性,第一种和第二种方式都修改也是没有问题的,
记得固定信息要一直,上面代码只是示范效果。
三、其他
1、Android13 热点默认5G频道配置修改总结
方式1:系统中热点默认配置信息对象 WifiApConfigStore.java,默认配置方法getDefaultApConfiguration() 中设置默认信息即可。
实现思路:
在默认配置方法getDefaultApConfiguration() 中设置默认信息即可。
方式二:把 WifiConfigStoreSoftAp.xml编写默认配置后,编译到运行系统的对应目录。
热点其他默认配置信息也可以参考修改。
2、之前写的热点相关知识汇总
https://so.csdn.net/so/search?q=热点&t=blog&u=wenzhi20102321
3、Android 设置默认热点名称和热点密码、密码长度
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算