You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:53:27