Android WIFI协议之WifiNetworkSpecifier 介绍

WifiNetworkSpecifier 

        是 Android 9 (API 级别 28) 引入的一个类,属于 Android 的 Wi-Fi 建议 API (Wi-Fi Suggestion API) 的一部分。它允许应用指定要连接的 Wi-Fi 网络的详细信息,而无需直接控制 Wi-Fi 连接。

主要用途

WifiNetworkSpecifier 主要用于以下场景:

  1. 应用知道用户需要连接的特定 Wi-Fi 网络

  2. 应用希望系统自动处理连接过程

  3. 应用不需要直接控制 Wi-Fi 连接

核心功能

构建网络规范

你可以使用 Builder 模式创建一个 WifiNetworkSpecifier

WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder()
    .setSsid("networkSSID")
    .setWpa2Passphrase("password123");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    builder.setIsHiddenSsid(true); // 对于隐藏网络
}

WifiNetworkSpecifier specifier = builder.build();

主要方法

  • setSsid(String ssid): 设置网络 SSID

  • setBssid(MacAddress bssid): 设置特定的 BSSID (可选)

  • setWpa2Passphrase(String passphrase): 设置 WPA2 PSK 密码

  • setWpa3Passphrase(String passphrase): 设置 WPA3 SAE 密码 (Android 10+)

  • setIsHiddenSsid(boolean isHiddenSsid): 是否为隐藏网络

  • setEnterpriseConfig(WifiEnterpriseConfig enterpriseConfig): 设置企业网络配置

使用示例

基本使用

// 创建网络规范
WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
    .setSsid("MyWiFiNetwork")
    .setWpa2Passphrase("MyPassword")
    .build();

// 创建网络请求
NetworkRequest request = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .setNetworkSpecifier(specifier)
    .build();

// 注册网络回调
ConnectivityManager connectivityManager = 
    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        // 网络可用
    }
    
    @Override
    public void onUnavailable() {
        // 网络不可用
    }
};

// 请求网络
connectivityManager.requestNetwork(request, networkCallback);

企业网络示例

WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS);
enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
enterpriseConfig.setIdentity("username");
enterpriseConfig.setPassword("password");
enterpriseConfig.setCaCertificate(caCert);

WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
    .setSsid("EnterpriseNetwork")
    .setEnterpriseConfig(enterpriseConfig)
    .build();

权限要求

使用 WifiNetworkSpecifier 需要以下权限:

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<!-- 从 Android 10 开始需要位置权限 -->

与传统方法的区别

与传统直接控制 Wi-Fi 的方法相比,WifiNetworkSpecifier 有以下优势:

  1. 更安全的权限模型:应用不需要 CHANGE_WIFI_STATE 权限

  2. 更好的用户体验:系统处理连接过程,用户可以拒绝请求

  3. 更少的后台干扰:应用不能随意更改 Wi-Fi 状态

注意事项

  1. 用户确认:在 Android 10 及以上版本,系统会显示一个对话框要求用户确认连接

  2. 后台限制:后台应用可能无法成功触发连接

  3. 网络选择:最终由系统决定是否以及何时连接到指定网络

  4. 兼容性:仅适用于 Android 9 (API 28) 及以上版本

最佳实践

  1. 仅在确实需要连接特定网络时使用

  2. 提供清晰的用户界面解释为什么要连接该网络

  3. 处理连接失败的情况

  4. 在不再需要时取消网络请求

WifiNetworkSpecifier 提供了一种更安全、更用户友好的方式来请求 Wi-Fi 连接,特别适合那些知道用户需要连接哪个网络但不需要持续控制 Wi-Fi 状态的应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值