在 Android 12 中无法使用 onCapativityChanged 获取 WIFI SSID

问题描述 投票:0回答:4

描述

我无法使用 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 : false
  • 但是,对于同一个网络,当我尝试使用以下命令获取 WIFI SSID 时
    onCapabilitiesChanged
    ,它返回 SSID: 和 获取隐藏SSID:true

注意:提供位置权限。

android wifi android-wifi ssid android-12
4个回答
13
投票

花了几天时间,终于找到了为什么我在

onCapabilitiesChanged
中收不到SSID。

创建对象时,我们需要在

FLAG_INCLUDE_LOCATION_INFO
构造函数中传递
ConnectivityManager.NetworkCallback

在默认构造函数中,位置敏感信息被隐藏,因为我们无法在

onCapabilitiesChanged
中获取SSID。一旦我们创建带有标志的
NetworkCallback
对象,我们将获得 SSID。

链接


1
投票

获取 SSID 和 BSSID API31 Xamarin C# 示例

所需权限: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;
            }
        }
    }

点击Android API参考.ConnectivityManager.NetworkCallback(int)


0
投票

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)


0
投票

此方法适用于所有 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)

}

© www.soinside.com 2019 - 2024. All rights reserved.