最近用Android 开发时需要AP,也就是需要打开和关闭Wi‑Fi AP,这里简单记录一下怎么使用已经相关内容,记录于此,方便自己查阅。
正文
什么是AP
全称:Wireless Access Point
中文常叫:无线接入点 / 热点
在Wi‑Fi中有两种模式
STA(Station):连 Wi‑Fi 的设备(手机、笔记本)
AP(Access Point):提供 Wi‑Fi 让别人连的设备
手机“开热点”:手机从 STA 模式 → 切到 AP 模式
Wi‑Fi AP 状态值
| 常量名 | 值 | 含义 | 是否稳定状态 |
|---|---|---|---|
WIFI_AP_STATE_DISABLING | 10 | 正在关闭热点 | 过渡态 |
WIFI_AP_STATE_DISABLED | 11 | 热点已关闭 | 稳定态 |
WIFI_AP_STATE_ENABLING | 12 | 正在开启热点 | 过渡态 |
WIFI_AP_STATE_ENABLED | 13 | 热点已开启 | 稳定态 |
WIFI_AP_STATE_FAILED | 14 | 开启/关闭失败 | 稳定态(异常) |
稳定状态:你可以认为操作已完成
过渡状态:只是中间过程,最终一定会变成 ENABLED / DISABLED / FAILED
AP流程
# 打开热点 DISABLED ↓ (调用开启) ENABLING ↓ ENABLED # 关闭热点 ENABLED ↓ (调用关闭) DISABLING ↓ DISABLED
异常情况(FAILED = 14)
常见原因:
| 场景 | 说明 |
|---|---|
| 飞行模式开启 | 无法启动 AP |
| Wi‑Fi + AP 互斥策略 | 某些设备不允许同时开 |
| 驱动 / HAL 返回错误 | fw crash、hostapd 起不来 |
| 权限不足 | 非 system / signature 应用 |
| 配置非法 | 空 SSID、无效频段等 |
监听 Wi‑Fi AP 状态变化
广播:WIFI_AP_STATE_CHANGED_ACTION
public class ApStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) { int state = intent.getIntExtra( WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED); switch (state) { case WifiManager.WIFI_AP_STATE_DISABLING: Log.d("AP", "正在关闭热点"); break; case WifiManager.WIFI_AP_STATE_DISABLED: Log.d("AP", "热点已关闭"); break; case WifiManager.WIFI_AP_STATE_ENABLING: Log.d("AP", "正在开启热点"); break; case WifiManager.WIFI_AP_STATE_ENABLED: Log.d("AP", "热点已开启"); break; case WifiManager.WIFI_AP_STATE_FAILED: int reason = intent.getIntExtra( WifiManager.EXTRA_WIFI_AP_FAILURE_REASON, -1); Log.e("AP", "热点开启失败, reason=" + reason); break; } } } }
注册广播
IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); context.registerReceiver(new ApStateReceiver(), filter);
开启 Wi‑Fi AP
Android 8+
普通 SDK 已无法直接 setWifiApEnabled
系统应用 / framework 内可用
使用 WifiManager.startSoftAp()
权限
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.NETWORK_SETTINGS" tools:ignore="ProtectedPermissions"/>
构造 AP 配置
WifiConfiguration config = new WifiConfiguration(); config.SSID = "MySystemAp"; config.preSharedKey = "12345678"; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
开启热点
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); boolean result = wifiManager.startSoftAp(config); Log.d("AP", "startSoftAp result=" + result);
返回值
true:请求已提交(不是成功)实际结果看
WIFI_AP_STATE_CHANGED_ACTION
关闭Wi-Fi AP
wifiManager.stopSoftAp();小问题
Wi‑Fi 和 AP 能同时存在吗?
能,前提是芯片 + Android 策略允许
手机连路由器后再开 AP,别人有网吗?
用「热点共享 / Tethering」→ 有网
只
startSoftAp()→ 没网芯片不支持 → STA 会断
参考文章
Android 源码

