WifiNetworkSpecifier
是 Android 9 (API 级别 28) 引入的一个类,属于 Android 的 Wi-Fi 建议 API (Wi-Fi Suggestion API) 的一部分。它允许应用指定要连接的 Wi-Fi 网络的详细信息,而无需直接控制 Wi-Fi 连接。
主要用途
WifiNetworkSpecifier
主要用于以下场景:
-
应用知道用户需要连接的特定 Wi-Fi 网络
-
应用希望系统自动处理连接过程
-
应用不需要直接控制 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
有以下优势:
-
更安全的权限模型:应用不需要
CHANGE_WIFI_STATE
权限 -
更好的用户体验:系统处理连接过程,用户可以拒绝请求
-
更少的后台干扰:应用不能随意更改 Wi-Fi 状态
注意事项
-
用户确认:在 Android 10 及以上版本,系统会显示一个对话框要求用户确认连接
-
后台限制:后台应用可能无法成功触发连接
-
网络选择:最终由系统决定是否以及何时连接到指定网络
-
兼容性:仅适用于 Android 9 (API 28) 及以上版本
最佳实践
-
仅在确实需要连接特定网络时使用
-
提供清晰的用户界面解释为什么要连接该网络
-
处理连接失败的情况
-
在不再需要时取消网络请求
WifiNetworkSpecifier
提供了一种更安全、更用户友好的方式来请求 Wi-Fi 连接,特别适合那些知道用户需要连接哪个网络但不需要持续控制 Wi-Fi 状态的应用。