WifiConfiguration已废弃,用WifiNetworkSpecifier.Builder开启LocalOnlyHotspot失败求修复
问题分析
你用错了核心API:WifiNetworkSpecifier.Builder是用来连接已存在的WiFi网络的,完全不是创建LocalOnlyHotspot的工具。创建本地热点需要使用Android 8.0(API 26)开始提供的startLocalOnlyHotspot系列方法。
修复后的代码
以下是适配不同Android版本的正确实现,包含权限处理和完整的热点创建/关闭逻辑:
1. 权限声明(在AndroidManifest.xml中添加)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- Android 10+ 如需后台维持热点,需添加 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2. 核心代码实现
public class HotspotManager { private WifiManager.LocalOnlyHotspotReservation hotspotReservation; public void turnOnLocalOnlyHotspot(Context context) { // 先检查位置权限,无权限则动态申请 if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1001); return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 先关闭已存在的热点 if (hotspotReservation != null) { hotspotReservation.close(); hotspotReservation = null; } if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { // Android 8.0-11 用ConnectivityManager创建热点 ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); connectivityManager.startLocalOnlyHotspot(new ConnectivityManager.LocalOnlyHotspotCallback() { @Override public void onStarted(@NonNull WifiManager.LocalOnlyHotspotReservation reservation) { super.onStarted(reservation); hotspotReservation = reservation; // 获取系统自动生成的热点信息 WifiConfiguration config = reservation.getWifiConfiguration(); Log.d("Hotspot", "SSID: " + config.SSID + ", 密码: " + config.preSharedKey); Toast.makeText(context, "本地热点已创建", Toast.LENGTH_SHORT).show(); } @Override public void onFailed(int reason) { super.onFailed(reason); Toast.makeText(context, "热点创建失败,原因码: " + reason, Toast.LENGTH_SHORT).show(); } }, new Handler(Looper.getMainLooper())); } else { // Android 12+ 移至WifiManager管理 WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() { @Override public void onStarted(@NonNull WifiManager.LocalOnlyHotspotReservation reservation) { super.onStarted(reservation); hotspotReservation = reservation; WifiConfiguration config = reservation.getWifiConfiguration(); Log.d("Hotspot", "SSID: " + config.SSID + ", 密码: " + config.preSharedKey); Toast.makeText(context, "本地热点已创建", Toast.LENGTH_SHORT).show(); } @Override public void onFailed(int reason) { super.onFailed(reason); Toast.makeText(context, "热点创建失败,原因码: " + reason, Toast.LENGTH_SHORT).show(); } }, new Handler(Looper.getMainLooper())); } } else { Toast.makeText(context, "系统版本低于Android 8.0,不支持本地热点", Toast.LENGTH_SHORT).show(); } } // 主动关闭热点 public void turnOffLocalOnlyHotspot() { if (hotspotReservation != null) { hotspotReservation.close(); hotspotReservation = null; } } }
3. 关键注意事项
- 权限是前提:创建LocalOnlyHotspot必须获取位置权限,且需运行时动态申请,否则会直接创建失败。
- 版本适配:Android 12+将热点管理逻辑从
ConnectivityManager移至WifiManager,需分开处理。 - 热点参数由系统生成:LocalOnlyHotspot不支持手动指定SSID和密码,系统会自动生成安全的热点参数,可通过
reservation.getWifiConfiguration()获取。
内容的提问来源于stack exchange,提问作者VISHAL KUMAVAT
相关产品推荐
相关产品推荐

