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

完美解决我的问题。

相关推荐
YB137510 小时前
jetpack compose 副作用 SideEffect
android·kotlin
CHB12 小时前
uni-app x 蒸汽模式 性能测试基准报告 Benchmark【Android版】
android·ios·uni-app
带娃的IT创业者13 小时前
拆掉那堵墙:LibrePods 如何让 AirPods 在 Android 上重获新生
android·开源项目·airpods·librepods·生态解锁
_阿南_14 小时前
flutter 展示的字体突然奔放了
android·flutter·ios
文人sec17 小时前
MySQL事务与索引做了什么?
android·笔记·mysql
刘洋浪子18 小时前
AndroidStudio保存日志菜单
android
朱涛的自习室18 小时前
从 Prompt 到 Graph:AI 工程的进化史
android·前端·人工智能
2501_9327502619 小时前
Android 中 Serializable 与 Parcelable 的对比与选择
android
FungLeo20 小时前
Flutter 两个反直觉布局坑:ListTile 水波纹 / VerticalDivider 踩坑实录
android·flutter
1570925113420 小时前
ViewBinding与DataBinding区别与选型
android