描述
我无法使用 Android-12 中
onCapabilitiesChanged
类中的 ConnectivityManager.NetworkCallback
获取 WIFI SSID。
在 Android-12 中,getConnectionInfo 已弃用。因此,正如 android 文档建议的那样,我正在尝试使用 WifiInfo
获取 onCapabilitiesChanged
对象。
像这样
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
}
但是,当我打印
WifiInfo
对象时。它将打印 SSID: getHiddenSSID
返回 true。
意外的行为是,
Android-12 设备连接一个 WIFI(例如 ABC)
getConnectionInfo
获取 WIFI SSID 时。它返回
SSID: ABC 和 getHiddenSSID : falseonCapabilitiesChanged
,它返回 SSID:注意:提供位置权限。
花了几天时间,终于找到了为什么我在
onCapabilitiesChanged
中收不到SSID。
创建对象时,我们需要在
FLAG_INCLUDE_LOCATION_INFO
构造函数中传递 ConnectivityManager.NetworkCallback
。
在默认构造函数中,位置敏感信息被隐藏,因为我们无法在
onCapabilitiesChanged
中获取SSID。一旦我们创建带有标志的 NetworkCallback
对象,我们将获得 SSID。
所需权限:CHANGE_NETWORK_STATE、ACCESS_FINE_LOCATION
如果API<31 TransportInfo将返回Null
using Android.Content;
using Android.Net;
using Android.Net.Wifi;
protected override void OnStart()
{
base.OnStart();
NetworkRequest request = new NetworkRequest.Builder().AddTransportType(transportType: TransportType.Wifi).Build();
ConnectivityManager connectivityManager = Android.App.Application.Context.GetSystemService(Context.ConnectivityService) as ConnectivityManager;
NetworkCallbackFlags flagIncludeLocationInfo = NetworkCallbackFlags.IncludeLocationInfo;
NetworkCallback networkCallback = new NetworkCallback((int)flagIncludeLocationInfo);
connectivityManager.RequestNetwork(request, networkCallback);
}
private class NetworkCallback : ConnectivityManager.NetworkCallback
{
public NetworkCallback(int flags) : base(flags)
{
}
public override void OnCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities)
{
base.OnCapabilitiesChanged(network, networkCapabilities);
WifiInfo wifiInfo = (WifiInfo)networkCapabilities.TransportInfo;
if (wifiInfo != null)
{
string ssid = wifiInfo.SSID.Trim(new char[] {'"', '\"' });
string bssid = wifiInfo.BSSID;
}
}
}
从
new NetworkCallback()
替换为 new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO)
。
示例代码:
final NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
final ConnectivityManager connectivityManager =
context.getSystemService(ConnectivityManager.class);
final NetworkCallback networkCallback = new NetworkCallback(ConnectivityManager.NetworkCallback.FLAG_INCLUDE_LOCATION_INFO) {
...
@Override
void onAvailable(Network network) {}
@Override
void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo();
}
// etc.
};
connectivityManager.requestNetwork(request, networkCallback); // For request
connectivityManager.registerNetworkCallback(request, networkCallback); // For listen
参考链接:
https://developer.android.com/reference/android/net/wifi/WifiManager#getConnectionInfo() https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback#NetworkCallback(int)
此方法适用于所有 Android 版本,但对于 Android 8.0 (Oreo) 及更高版本,您需要打开位置服务(GPS)才能访问 Wi-Fi SSID。此外,您需要请求运行时的
ACCESS_COARSE_LOCATION
和 ACCESS_FINE_LOCATION
权限并在清单文件中声明它们。
如果你想在后台访问Wi-Fi SSID,你可以编写一个前台服务来处理。
private fun checkWIFIName(context: Context) : Boolean {
val wifiManager = context.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
val wifiInfo = wifiManager.connectionInfo
println("SSID : ${wifiInfo.ssid}")
return wifiInfo.ssid.trim().equals("\"$SSID\"", true)
}