Android16(API36)在获取WiFi信息时SSID为<unknown ssid>

我在进行WiFi扫描和获取当前连接WiFi时,获取SSID为:<unknown ssid>,主要原因还是权限不够。

1.权限给得足足的。

XML 复制代码
<!--网络权限-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <!--wifi-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 获取精确位置权限 Android 12 以下版本,需要清单文件中注册-->
    <uses-permission
        android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 获取粗略位置权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- WIFI 权限(Android 13.0 新增的权限)-->
    <uses-permission
        android:name="android.permission.NEARBY_WIFI_DEVICES"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />

2.检查权限并请求权限。

java 复制代码
/**
     * 检查并请求 WiFi 相关权限
     */
    private void checkAndRequestWifiPermissions() {//36-16
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            // Android 13+ 需要 NEARBY_WIFI_DEVICES 权限
            List<IPermission> permissionList = new ArrayList<>();
            permissionList.add(PermissionLists.getNearbyWifiDevicesPermission());
            permissionList.add(PermissionLists.getAccessFineLocationPermission());
            if (!XXPermissions.isGrantedPermissions(this, permissionList)) {
                requestWifiPermissionsForAndroid13Plus();
                return;
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            // Android 12 需要 ACCESS_FINE_LOCATION 权限
            if (!XXPermissions.isGrantedPermission(this, PermissionLists.getBluetoothScanPermission())) {
                requestWifiPermissionsForAndroid12();
                return;
            }
        } else {
            // Android 11 及以下需要 ACCESS_FINE_LOCATION 权限
            List<IPermission> permissionList = new ArrayList<>();
            permissionList.add(PermissionLists.getAccessFineLocationPermission());
            permissionList.add(PermissionLists.getAccessCoarseLocationPermission());
            if (!XXPermissions.isGrantedPermissions(this, permissionList)) {
                requestWifiPermissionsForAndroid11Below();
                return;
            }
        }
        // 权限已授予,执行 WiFi 操作
        checkWifiAvailable();
    }

    /**
     * Android 13+ 请求 WiFi 权限
     */
    private void requestWifiPermissionsForAndroid13Plus() {
        XXPermissions.with(this)
                .permission(PermissionLists.getNearbyWifiDevicesPermission())
                .permission(PermissionLists.getAccessFineLocationPermission())
                .interceptor(new PermissionInterceptor())
                .description(new PermissionDescription())
                .request((grantedList, deniedList) -> {
                    LogUtils.i("grantedList:" + grantedList.size() + "  deniedList:" + deniedList.size());
                    if (deniedList.isEmpty()) {
                        checkWifiAvailable();
                    } else {
                        T.INSTANCE.error("权限被拒绝,无法获取 WiFi 信息");
                    }
                });
    }

    /**
     * Android 12 请求 WiFi 权限
     */
    private void requestWifiPermissionsForAndroid12() {
        XXPermissions.with(this)
                .permission(PermissionLists.getBluetoothScanPermission())
                .interceptor(new PermissionInterceptor())
                .description(new PermissionDescription())
                .request((grantedList, deniedList) -> {
                    if (deniedList.isEmpty()) {
                        checkWifiAvailable();
                    } else {
                        T.INSTANCE.error("权限被拒绝,无法获取 WiFi 信息");
                    }
                });
    }

    /**
     * Android 11 及以下请求 WiFi 权限
     */
    private void requestWifiPermissionsForAndroid11Below() {
        XXPermissions.with(this)
                .permission(PermissionLists.getAccessFineLocationPermission())
                .permission(PermissionLists.getAccessCoarseLocationPermission())
                .interceptor(new PermissionInterceptor())
                .description(new PermissionDescription())
                .request((grantedList, deniedList) -> {
                    if (deniedList.isEmpty()) {
                        checkWifiAvailable();
                    } else {
                        T.INSTANCE.error("权限被拒绝,无法获取 WiFi 信息");
                    }
                });
    }

3.获取当前连接WiFi信息。

java 复制代码
 /**
     * 已连接的 WiFi 信息
     */
    private Net1Model getConnectWifiInfo() {
        Net1Model net1Model = new Net1Model();
        // 1. 首先检查是否有 WiFi 权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            // 没有权限,返回未连接状态
            net1Model.setWifiName("");
            net1Model.setConnectState(0);
            net1Model.setWifiLevel(0);
            return net1Model;
        }
        // 2. 尝试从 WifiManager 获取连接信息
        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
        if (wifiInfo != null && wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
            String ssid = wifiInfo.getSSID();
            String bssid = wifiInfo.getBSSID();
            int rssi = wifiInfo.getRssi();
            LogUtils.i("ssid :" + ssid + "   rssi : " + rssi + "   bssid : " + bssid);

            // 移除 SSID 周围的引号
            if (!TextUtils.isEmpty(ssid) && ssid.startsWith("\"") && ssid.endsWith("\"")) {
                ssid = ssid.substring(1, ssid.length() - 1);
            }

            // 3. 验证是否真正连接到网络(双重校验)
            if (!TextUtils.isEmpty(ssid) && NetworkExUtils.INSTANCE.isWifiNetwork(this)) {
                // 已连接到 WiFi 且可以正常上网
                net1Model.setWifiName(ssid);
                net1Model.setConnectState(1);
                net1Model.setWifiLevel(rssi);
                return net1Model;
            }
        }
        // 4. 降级方案:通过 ConnectivityManager 判断是否使用 WiFi 上网
        if (NetworkExUtils.INSTANCE.isWifiNetwork(this)) {
            // 虽然无法获取 SSID,但确实在使用 WiFi
            net1Model.setWifiName("已连接 WiFi");
            net1Model.setConnectState(1);
            net1Model.setWifiLevel(0);
            return net1Model;
        }
        // 5. 未连接
        net1Model.setWifiName("");
        net1Model.setConnectState(0);
        net1Model.setWifiLevel(0);
        return net1Model;
    }

完美解决我的问题。

相关推荐
jwn99936 分钟前
Laravel9.x核心特性全解析
android
今天又在写代码1 小时前
数据智能分析平台部署服务器
android·服务器·adb
梦里花开知多少2 小时前
深入谈谈Launcher的启动流程
android·架构
jwn9992 小时前
Laravel11.x新特性全解析
android·开发语言·php·laravel
我就是马云飞3 小时前
停更5年后,我为什么重新开始写技术内容了
android·前端·程序员
stevenzqzq3 小时前
Kotlin 协程:withContext 与 async 核心区别与使用场景
android·开发语言·kotlin
唔663 小时前
原生 Android(Kotlin)仅串口「侵入式架构」完整案例三
android·架构·kotlin
唔663 小时前
原生 Android(Kotlin)仅串口「可插拔架构」完整案例一
android·架构·kotlin
Melrose3 小时前
移动端安全攻防
android·前端·安全
葡萄城技术团队3 小时前
Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度
android·java·microsoft