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;
    }

完美解决我的问题。

相关推荐
拥小抱6 小时前
Compose 知识点
android
文章永久免费只为良心6 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_86897 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港9 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA10 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui11 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng12 小时前
Android获取崩溃日志
android
aqi0012 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
GY-9312 小时前
【Android】Android Studio 中的协程
android