前言

最近用Android 开发时需要AP,也就是需要打开和关闭Wi‑Fi AP,这里简单记录一下怎么使用已经相关内容,记录于此,方便自己查阅。

正文

什么是AP

AP = Access Point(接入点)

  1. 全称:Wireless Access Point

  2. 中文常叫:无线接入点 / 热点

在Wi‑Fi中有两种模式

  • STA(Station:连 Wi‑Fi 的设备(手机、笔记本)

  • AP(Access Point):提供 Wi‑Fi 让别人连的设备

手机“开热点”:手机从 STA 模式 → 切到 AP 模式

Wi‑Fi AP 状态值

常量名含义是否稳定状态
WIFI_AP_STATE_DISABLING10正在关闭热点过渡态
WIFI_AP_STATE_DISABLED11热点已关闭稳定态
WIFI_AP_STATE_ENABLING12正在开启热点过渡态
WIFI_AP_STATE_ENABLED13热点已开启稳定态
WIFI_AP_STATE_FAILED14开启/关闭失败稳定态(异常)

稳定状态:你可以认为操作已完成

过渡状态:只是中间过程,最终一定会变成 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

  1. Android 8+

  2. 普通 SDK 已无法直接 setWifiApEnabled

  3. 系统应用 / 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();

小问题

  1. Wi‑Fi 和 AP 能同时存在吗?

    能,前提是芯片 + Android 策略允许

  1. 手机连路由器后再开 AP,别人有网吗?

    • 用「热点共享 / Tethering」→ 有网

    • startSoftAp() → 没网

    • 芯片不支持 → STA 会断

参考文章

  1. Android 源码

  2. AI

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...