我在进行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;
}
完美解决我的问题。

