Android 实现热点开机后自动开启

Android 实现热点开机后自动开启

文章目录

  • Android 实现热点开机后自动开启
    • 一、前言
    • 二、实现方式
      • 1、在 WifiServiceImpl 启动热点
      • 2、在开机广播中开启热点
    • 三、其他
      • 1、热点开机自启动方式总结
      • 2、热点开启流程
      • 3、热点启动相关日志
      • 4、其他热点相关知识分享

一、前言

Android 热点是有api设置永久开启,热点名称,热点密码等接口,但是“永久开启”实际上是不自动关闭,重启设备后热点并不会自动开启。

Android Wifi实现开关状态记忆是基于Settings.GLOBAL.WIFI_ON属性,

所以热点如果要实现状态记忆那么也是要设置一个Settings属性或者prop属性,

系统启动后判断属性决定是否启动热点就可以实现热点状态记忆了。

Android Wifi有自己的服务WifiService和服务实现WifiServiceImpl,

热点是没有对应服务的,那怎么办呢?大致有两种方法可以解决。

二、实现方式

1、在 WifiServiceImpl 启动热点

热点操作其实同样在 WifiServiceImpl 判断处理即可,因为热点的api实现很多也是封装在WifiServiceImpl 里面的。

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

import android.os.SystemProperties; //记得导包/*** WifiService handles remote WiFi operation requests by implementing* the IWifiManager interface.*/
public class WifiServiceImpl extends BaseWifiService {//系统服务启动后判断Wifi的逻辑方法public void checkAndStartWifi() {//根据wifi 属性判断是否启动wifimWifiThreadRunner.post(() -> {
。。。// Check if wi-fi needs to be enabledboolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();Log.i(TAG,"WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled")); //可以看到这里是有个打印的
。。。}}//根据热点 属性判断是否启动热点mWifiThreadRunner.postDelayed(() -> {boolean isHotspotEnable = SystemProperties.getBoolean("persist.skg.hotspot.enable", false);Log.d(TAG, "checkAndStartWifi start ap isHotspotEnable = " + isHotspotEnable);if (isHotspotEnable) {startTetheredHotspot(getSoftApConfiguration(), mContext.getPackageName());}},100);//延时一下比较好,避免wifi启动未处理完成}
}

开机后抓的WifiService 关键字的 logcat 日志:

console:/ # logcat | grep WifiService   
12-14 17:34:21.258   639   639 I SystemServiceManager: Starting com.android.server.wifi.WifiService
12-14 17:34:21.289   639   639 I WifiService: Registering wifi
//wifi是否启动日志
12-14 17:34:21.910   639   803 I WifiService: WifiService starting up with Wi-Fi enabled
...
//自己添加的热点是否需要启动的日志
12-14 18:33:35.902   639   803 D WifiService: checkAndStartWifi start ap isHotspotEnable = true
12-14 18:33:35.903   639   803 I WifiService: startTetheredHotspot uid=1000
...
12-14 18:33:36.011   639   803 D WifiService: updateInterfaceIpState: ifaceName=ap0 mode=1 previous LOHS mode= -1
12-14 18:33:36.636   639   863 I WifiService: acquireMulticastLock uid=1000
12-14 18:33:39.621   639   803 D WifiService: handleBootCompleted---mIsBootComplete---true

2、在开机广播中开启热点

Android 原生广播:

Intent.ACTION_BOOT_COMPLETED = android.intent.action.BOOT_COMPLETED

应用接收到开机广播后,开启热点:

boolean isHotspotEnable = SystemProperties.getBoolean("persist.skg.hotspot.enable", false);
Log.d(TAG, "checkAndStartWifi start ap isHotspotEnable = " + isHotspotEnable);
if (isHotspotEnable) {ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);mConnectivityManager.startTethering(TETHERING_WIFI, true, null, new Handler(Looper.getMainLooper()));
}

但是开机广播有些方案上会比较慢,有些要界面显示后还要等半分钟左右才才收到开机广播。

这种情况一般是静态接收开机广播的情况,广播优先级并未提高,系统多个接收广播的地方有耗时处理导致。

开机广播慢解决的方法:

1、自定义开机广播,不用等所有的系统服务启动完成就发出该广播BOOT_COMPLETED 也是在 UserController.java 里面发出的,可以在之前发出自定义广播,会比所有的 BOOT_COMPLETED 广播都快,但是需要对系统启动有一定的了解,避免写出bugframeworks\base\services\core\java\com\android\server\am\UserController.java2、静态广播提高优先级<receiver android:name=".MyReceiver"><intent-filter android:priority="1000"><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter>
</receiver>3、动态注册开机广播开机广播也是可以动态注册的,一般是在自己定义的系统服务内进行监听,会比静态广播收到更早。

三、其他

1、热点开机自启动方式总结

(1)系统服务启动的时候启动热点(2)开机广播启动热点

怎么设置自己定义的属性,上面并没有讲,因为我这边的系统一般都是自己的设置应用,在设置应用点击开关的时候设置那个属性就行了。

但是如果全是用的原生的应用呢,并且要保证其他app开关热点能够同步信息,就要在热点启动流程里面设置那个属性了, 代码:TetheringManager startTethering 和 stopTethering ,具体流程可以往下看看。

2、热点开启流程

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

3、热点启动相关日志

看了上面启动流程,可以发现热点最重要的日志是在 SoftApManager 里面

logcat -c ;logcat | grep -E "TetheringManager|SoftApManager" 
//(1)调用开启热点接口和应用包名
12-19 14:38:01.748  1902  7767 I TetheringManager: startTethering caller:com.my.settings//(2)热点开启成功
12-19 14:38:01.966   949  1267 D SoftApManager[ap0]: Soft AP is started
//(3)热点部分信息
12-19 14:38:02.430   949  1267 D SoftApManager[ap0]: SoftApInfo update SoftApInfo{bandwidth= 3, frequency= 5745,bssid=be:05:dc:cb:ae:86, wifiStandard= 5, mApInstanceIdentifier= ap0, mIdleShutdownTimeoutMillis= 600000}, isRemoved: false
12-19 14:38:02.431   949  1267 D SoftApManager[ap0]: rescheduleTimeoutMessageIfNeeded ap0, timeoutEnabled=true, isChargingfalse, clientNumber=0
//(4)热点10分钟后自动关闭
12-19 14:38:02.434   949  1267 D SoftApManager[ap0]: Timeout message scheduled, on ap0, delay = 600000//(5)调用热点关闭和应用包名
12-19 14:38:11.244  1902  1902 I TetheringManager: stopTethering caller:com.my.settings
//(6)热点关闭成功
12-19 14:38:11.556   949  1267 D SoftApManager[ap0]: Soft AP is stopped
12-19 14:38:11.559   949  1267 D SoftApManager[ap0]: Timeout message canceled on ap0
12-19 14:38:11.569   949  1267 V WifiActiveModeWarden: ModeManager removed SoftApManager{id=547203 iface=null role=null}

4、其他热点相关知识分享

都是一些自己开发中遇到的知识记录:

Android11 热点设置永不关闭

Android11 设置默认热点名称和热点密码、密码长度

Android11 热点配置信息保存分析

Android13分享热点设置安全性为wpa3

Android11 热点Band值为3

Android11 Wifi 加密类型详解

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

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

相关文章

任天堂,steam游戏机通过type-c给VR投屏与PD快速充电的方案 三type-c口投屏转接器

游戏手柄这个概念&#xff0c;最早要追溯到二十年前玩FC游戏的时候&#xff0c;那时候超级玛丽成为了许多人童年里难忘的回忆&#xff0c;虽然长大了才知道超级玛丽是翻译错误&#xff0c;应该是任天堂的超级马里奥&#xff0c;不过这并不影响大家对他的喜爱。 当时FC家用机手柄…

中国社科院与新加坡新跃社科大联合培养博士—未来是我们自己创造的

没有任何东西能像大胆的幻想那样促进未来的创立&#xff0c;没有任何东西能像扎实的实践那样实现幻想的未来&#xff0c;今天的幻想加实践就是明天的现实&#xff01;中国社科大-新加坡新跃社科大学联合培养工商管理博士&#xff0c;期待与您一起实现我们的未来。 人的一生其实…

SAP系统标准表之间的关联关系对应

SAP系统标准表之间的关联关系对应

指标体系构建-02-从0开始,梳理数据指标体系

指标体系构建-02-从0开始&#xff0c;梳理数据指标体系 一个例子&#xff0c;看懂并列式指标梳理 并列式指标体系&#xff0c;一般用于&#xff1a;描述个体情况 当我们想从几个不同角度&#xff0c;描述问题的时候&#xff0c;就需要并列关系 举个栗子&#x1f330;&#xf…

阿里云 ACK One 新特性:多集群网关,帮您快速构建同城容灾系统

云布道师 近日&#xff0c;阿里云分布式云容器平台 ACK One[1]发布“多集群网关”[2]&#xff08;ACK One Multi-cluster Gateways&#xff09;新特性&#xff0c;这是 ACK One 面向多云、多集群场景提供的云原生网关&#xff0c;用于对多集群南北向流量进行统一管理。 基于 …

redis 从0到1完整学习 (三):redis 数据结构

文章目录 0. 概述0.1 简要介绍 1. Strings1.1 常用命令 2 Lists2.1 常用命令 3. Sets3.1 常用命令 4. Hashes4.1 常用命令 5. Sorted sets5.1 常用命令 6. Streams6.1 常用命令 7. 参考 0. 概述 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&…

SpringBoot+Redis的Bloom过滤器

1.保姆级Linux安装Redis ①把redis.tar.gz下载到linux中&#xff0c;并用命令tar -zxvf安装 ②安装完成进入目录输入make进行编译&#xff0c;编译完成后输入make install 进行安装 ③创建两个文件夹mkdir bin mkdir etc 将redis目录下的redis.conf文件移动到etc文件中&…

普通相机标定——OpenCV函数讲解(下)

cv::projectPoints void cv::projectPoints(InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian = noArray(), double aspectRatio = 0 ) /** @brief 将世界坐标系中…

Modbus-TCP数据帧

Modbus-TCP基于4种报文类型 MODBUS 请求是客户机在网络上发送用来启动事务处理的报文MODBUS 指示是服务端接收的请求报文MODBUS 响应是服务器发送的响应信息MODBUS 证实是在客户端接收的响应信息 Modbus-TCP报文: 报文头MBAP MBAP为报文头&#xff0c;长度为7字节&#xff0c…

设计模式(三)-结构型模式(6)-享元模式

一、为何需要享元模式&#xff08;Flyweight&#xff09;? 假如在网页中渲染这样的一个画面&#xff1a;大小不一的星星铺满了整个画布&#xff0c;并且都在不断的进行移动闪烁着。一批星星消失了&#xff0c;另一批又从另一边缘处出现。 要实现这样的渲染效果&#xff0c;在…

DshanMCU-R128s2 配置引脚复用

本文中的约定 描述 GPIO 配置的形式&#xff1a;Port:端口 组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态>文中的 <X>0,1,2,3,4,5…..&#xff0c;如 twi0&#xff0c;twi1….&#xff1b;uart0&#xff0c;uart1….。文中的 {PRO…

『居善地』接口测试 — 20.Mock功能介绍

1、Mock功能介绍 各个业务系统都会关联多个三方系统接口调用&#xff0c;在测试过程中第三方业务存在不能及时提供接口调用&#xff0c;这时就需要用到我们的mock服务了。 Mock的本质在于模拟三方业务接口的返回&#xff0c;来满足自身的测试功能&#xff0c;快速完成测试任务…

The engine “node“ is incompatible with this module.解决方法

安装依赖库报如下异常 [2/4] Fetching packages... error marked11.1.0: The engine "node" is incompatible with this module. Expected version "> 18". Got "16.14.0" error Found incompatible module. info Visit https://yarnpkg.com…

docker安装ES:7.8和Kibana:7.8

本文适用于centos7,快速入手练习es语法 前置&#xff1a;安装docker教程docker、docker-component安装-CSDN博客 1.安装es 9200为启动端口&#xff0c;9300为集群端口 docker pull elasticsearch:7.8.0mkdir -p /mydata/elasticsearch/pluginsmkdir -p /mydata/elasticsear…

python核心阶段(七)—— 包&模块以及虚拟环境

1.包&模块 概念解释 模块&#xff1a;为了使代码容易维护&#xff0c;可以将一组功能相关的代码写入一个单独的.py文件中&#xff0c;这 个.py文件就被称作一个模块 包&#xff1a; 包是指一个有层次的文件目录结构&#xff0c;它包含多个相关模块或子包&#xff1b; 它…

李群与李代数

群实际上就是一个特殊的集合&#xff0c;这个集合满足几个特点&#xff1a; 封闭性&#xff0c;就是对某种运算封闭&#xff0c;两个元素运算的结果仍然属于该集合结合性&#xff0c;结合律幺元&#xff0c;也就是存在一个“1”逆&#xff0c;也就是逆也在该集合中&#xff0c…

基于MybatisPlus批量高效插入百万条数据

引言 在JAVA程序开发中&#xff0c;对数据库进行大量数据插入是一个常见的操作&#xff0c;作为一个软件开发工程师&#xff0c;大批量的数据处理是日常工作&#xff0c;如何优化插入性能&#xff0c;提升数据处理效率是对大多数工程师的一个重要考验。本文将围绕逐条插入和批…

随时随地安心工作:迅软DSE保护您手机办公中的关键数据

互联网的快速发展让移动办公成为了日常工作中的一部分&#xff0c;同时企业数据加密的需求也已经不仅仅局限于内部终端&#xff0c;对于灵活的手机移动端也同样需要进行合法合规的数据安全管控。 迅软DSE数据防泄密系统提供移动端管理模块&#xff0c;支持Android、IOS移动客户…

BearPi Std 板从入门到放弃 - 引气入体篇(11)(SPI驱动 TFT LCD(ST7789))

简介 SPI 驱动 ST7789V2 进行字符显示, 并且使用中文库显示中文信息。主芯片: STM32L431RCT6LED : PC13 \ 推挽输出即可 \ 高电平点亮串口: Usart1 / LPUARTSPI(与LCD数据传输) : SPI2LCD_RESET&#xff08;复位引脚&#xff09;: PC7 \ 推挽输出即可 LCD_POWER&#xff08;…

通过几个基本概念说一下为什么openGauss是当下之选?

Database、Schema、User都是数据库的基本概念&#xff0c;SQL标准中也有明确规范。但不同数据库的具体实现也不尽相同&#xff0c;有些甚至大相径庭。这就导致用户在做国产化选型和数据库迁移时可能会遇到种种困难。本文从这几个基本概念展开&#xff0c;说说为什么openGauss系…