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

完美解决我的问题。

相关推荐
WarPigs2 小时前
Android开发笔记
android
星河耀银海2 小时前
C++ 异常处理机制:异常捕获、自定义异常与实战应用
android·java·c++
AndroidCode3 小时前
Android Automotive Power Policy 全流程技术解析
android
aykon3 小时前
android 扫码优化方案
android
墨狂之逸才3 小时前
Android TV 智能看板开发踩坑指南:WebView 常见问题与解决方
android
林栩link3 小时前
Now in Android 现代应用开发实践(三):架构设计(UI)
android·android jetpack
Coolmuster_cn3 小时前
永久擦除您的 Android
android
我命由我123453 小时前
Android 开发 - UriMatcher(一个 URI 分类器)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
阿拉斯攀登3 小时前
第 13 篇 输入设备驱动(触摸屏 / 按键)开发详解,Linux input 子系统全解析
android·linux·运维·驱动开发·rk3568·瑞芯微·rk安卓驱动