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

Android 12/13下无法获取已连接WiFi的SSID问题求助

解决Android 12/13获取已连接WiFi SSID显示<unknown ssid>的问题

问题根源

Android 12(API 31)及以上版本对WiFi信息的获取做了更严格的权限和状态限制:

  • 缺少Android 12新增的NEARBY_WIFI_DEVICES权限
  • 设备定位服务未开启,或未授予应用ACCESS_FINE_LOCATION权限
  • 未在回调中过滤非WiFi类型的网络

解决步骤

1. 补充Manifest权限

在现有权限基础上添加NEARBY_WIFI_DEVICES权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Android 12+ 新增WiFi权限 -->
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:minSdkVersion="31" />

2. 动态申请必要权限

针对Android 12+设备,动态申请NEARBY_WIFI_DEVICES和ACCESS_FINE_LOCATION权限:

private static final int REQUEST_WIFI_PERMISSIONS = 1001;

public void requestWifiPermissions(Activity activity) {
    List<String> permissions = new ArrayList<>();
    permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        permissions.add(Manifest.permission.NEARBY_WIFI_DEVICES);
    }
    ActivityCompat.requestPermissions(activity, permissions.toArray(new String[0]), REQUEST_WIFI_PERMISSIONS);
}

3. 修改NetworkCallback代码

增加WiFi类型判断、权限和定位状态检查:

public void registerNetworkCallback() {
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    connectivityManager.registerDefaultNetworkCallback(
            new ConnectivityManager.NetworkCallback() {
                @Override
                public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
                    super.onCapabilitiesChanged(network, networkCapabilities);
                    
                    // 仅处理WiFi网络
                    if (!networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        return;
                    }

                    // 检查定位权限与服务状态
                    boolean hasFineLocation = ActivityCompat.checkSelfPermission(context,
                            Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
                    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                    boolean isLocationEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
                            || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                    if (!hasFineLocation || !isLocationEnabled) {
                        Log.w("WifiActivityTest", "请开启定位服务并授予精确位置权限");
                        return;
                    }

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
                        if (wifiInfo != null) {
                            Log.i("WifiActivityTest", "SSID: " + wifiInfo.getSSID().replace("\"", ""));
                            Log.i("WifiActivityTest", "BSSID: " + wifiInfo.getBSSID());
                            Log.i("WifiActivityTest", "NetworkId: " + wifiInfo.getNetworkId());
                        }
                    }
                }
            });
}

4. 直接获取已连接WiFi信息的替代方案

如果回调方式仍有问题,可通过WifiManager直接获取:

public String getConnectedWifiDetails() {
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    
    // 权限与状态检查
    boolean hasFineLocation = ActivityCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    boolean isLocationEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
            || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    boolean hasNearbyWifi = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        hasNearbyWifi = ActivityCompat.checkSelfPermission(context,
                Manifest.permission.NEARBY_WIFI_DEVICES) == PackageManager.PERMISSION_GRANTED;
    }

    if (!hasFineLocation || !isLocationEnabled || !hasNearbyWifi) {
        return "<unknown ssid>";
    }

    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    if (wifiInfo != null && wifiInfo.getNetworkId() != -1) {
        return String.format("SSID: %s, BSSID: %s, NetworkId: %d",
                wifiInfo.getSSID().replace("\"", ""),
                wifiInfo.getBSSID(),
                wifiInfo.getNetworkId());
    }
    return "<unknown ssid>";
}

关键注意点

  • 定位服务必须开启:即使授予位置权限,定位服务关闭时Android 12+会隐藏WiFi SSID
  • NEARBY_WIFI_DEVICES是Android 12+的强制权限,用于访问WiFi设备详情
  • 动态权限申请不可省略,仅Manifest声明无法获得权限

内容的提问来源于stack exchange,提问作者Vijayadhas Chandrasekaran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:05:00