如何使用ConnectivityManager配置自定义SSID和密码开启Wi-Fi热点?
我之前踩过这个坑!你说的没错,WifiManager#setWifiApEnabled早就彻底没用了——看源码就知道它现在只是输出警告日志,完全不会触发热点启动,而且那几个注解@SystemApi、@Deprecated、@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)也摆明了:普通APP根本没权限用这个系统级接口。
下面是我实测有效的、适配高版本Android的解决方案:
正确实现自定义SSID/密码的Wi-Fi热点
1. 配置必要权限
首先在AndroidManifest.xml里声明基础权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- Android 12+ 额外需要这个权限用于热点配置 --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:minSdkVersion="31" />
注意:
TETHER_PRIVILEGED是系统级权限,普通APP无法直接声明,需要通过系统授权流程获取(后面会提到)。
2. 设置热点的SSID和密码参数
用WifiConfiguration定义热点的配置信息,然后通过WifiManager应用这个配置:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiConfiguration apConfig = new WifiConfiguration(); // 自定义SSID(热点名称) apConfig.SSID = "MyCustomHotspot_001"; // 自定义密码(必须至少8位) apConfig.preSharedKey = "MySecurePass123!"; // 设置加密方式为WPA2-PSK(最常用的安全模式) apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK); apConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); // 应用配置(Android Q及以上可用) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { boolean configSetSuccess = wifiManager.setSoftApConfiguration(apConfig); if (!configSetSuccess) { Log.e("Hotspot", "热点配置设置失败"); return; } }
3. 启动热点(Android 10+ 官方API)
使用ConnectivityManager的startTethering方法启动热点,这个方法会自动触发系统权限授权弹窗(如果用户还没授权):
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { connectivityManager.startTethering( ConnectivityManager.TETHERING_WIFI, // 指定启动Wi-Fi热点 true, // 是否显示系统授权弹窗 new ConnectivityManager.OnStartTetheringCallback() { @Override public void onTetheringStarted() { // 热点启动成功的回调 Log.d("Hotspot", "自定义热点已成功启动!"); // 这里可以更新UI提示用户 } @Override public void onTetheringFailed(int errorCode) { // 启动失败的回调,根据错误码处理 Log.e("Hotspot", "热点启动失败,错误码:" + errorCode); if (errorCode == ConnectivityManager.TETHER_ERROR_NO_PERMISSION) { // 权限不足,引导用户到热点设置页面手动授权 Intent settingsIntent = new Intent(Settings.ACTION_TETHER_SETTINGS); startActivity(settingsIntent); } } } ); }
4. 停止热点(可选)
如果需要关闭热点,同样用ConnectivityManager:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { connectivityManager.stopTethering(ConnectivityManager.TETHERING_WIFI); }
额外注意事项
- Android 9及以下:旧的反射方法
setWifiApEnabled可能还能工作,但官方已经废弃,不推荐使用,建议只在兼容旧版本时作为 fallback。 - 热点启动时,系统会自动关闭当前的Wi-Fi连接,不需要手动处理。
- 部分厂商可能对热点功能有定制限制,如果遇到异常,建议测试原生Android系统确认问题。
内容的提问来源于stack exchange,提问作者pebble
相关产品推荐
相关产品推荐

