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
相关产品推荐
相关产品推荐

