'connectionInfo 的 getter:WifiInfo!'已弃用。在 Java 中已弃用 (Api 31)

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

当我想通过 WifiManager.connectionInfo 获取有关当前 wifi 连接的信息时,我得到 这个:

“connectionInfo 的 getter:WifiInfo!”已弃用。在 Java 中已弃用

如何在 Android 12 中做到这一点? (只想获取RSSI)

android wifimanager android-12 android-api-31
2个回答
8
投票

从 Build.VERSION_CODES#S 开始,WifiInfo 检索已移至 ConnectivityManager API 表面。 WifiInfo 附加在 NetworkCapativity#getTransportInfo() 中,可通过 NetworkCallback#onCapabilitiesChanged(Network, NetworkCapativity) 中的回调获得,或根据 ConnectivityManager#getNetworkCapability(Network) 按需获得。

final NetworkRequest request =
       new NetworkRequest.Builder()
       .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
       .build();
  final ConnectivityManager connectivityManager =
       context.getSystemService(ConnectivityManager.class);
  final NetworkCallback networkCallback = new NetworkCallback() {
       ...
       @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/kotlin/android/net/wifi/WifiManager#getConnectionInfo()


0
投票
/**
 * Access connected wifi name from this var ..because we are using listener .. to set value ..
 * @see setCallBack method ..
 */
var connectedWifiName = ""



/**
 * This method will set the connected wifi name for all phones
 * @see connectedWifiName variable
 * @param mContext is the current fragment context ..
 * must be called when permission is granted ..
 * @see [https://developer.android.com/reference/kotlin/android/net/wifi/WifiManager#getConnectionInfo()]
 */
fun setConnectedWifiName(mContext : Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        val request = NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .build()
        val connManager =
            mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        connManager.registerNetworkCallback(request, setCallBack())
    } else {
        setWifiName(mContext)
    }

}

/**
 * This method will only be called for new phones from s/31/And -12 -- Snow Cone
 * required ...  ACCESS_NETWORK_STATE and ACCESS_FINE_LOCATION permissions
 * need to pass FLAG_INCLUDE_LOCATION_INFO to NetworkCallback(), otherwise you will get "unknow ssid" only
 * @see [https://developer.android.com/reference/kotlin/android/net/wifi/WifiManager#getConnectionInfo()]
 */
@RequiresApi(Build.VERSION_CODES.S)
private fun setCallBack(): ConnectivityManager.NetworkCallback {
    val networkCallback =
        object : ConnectivityManager.NetworkCallback(
            FLAG_INCLUDE_LOCATION_INFO
        ) {
            override fun onCapabilitiesChanged(
                network: Network,
                networkCapabilities: NetworkCapabilities
            ) {
                super.onCapabilitiesChanged(network, networkCapabilities)
                setUpWifiName(networkCapabilities.transportInfo as WifiInfo)
            }
        }

    return networkCallback

}

/**
 * This method will only be called --- below s/31/And -12 -- Snow Cone
 * @param mContext is current fragment context
 * ACCESS_WIFI_STATE  is required
 * ACCESS_COARSE_LOCATION with ACCESS_FINE_LOCATION for some specific version --->= 28/0/Oreo
 * @see [https://developer.android.com/develop/connectivity/wifi/wifi-scan#wifi-scan-permissions] for reference ..
 */
@Suppress("DEPRECATION")
private fun setWifiName(mContext : Context) {
    val wifiManager = mContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val wifiInfo =
        wifiManager.connectionInfo

    if (wifiInfo?.supplicantState == SupplicantState.COMPLETED) {
        setUpWifiName(wifiInfo)
    }
}

/**
 * Setting exact wifi name from here ..
 * @param wifiInfo is instance of WifiInfo ..
 */
private fun setUpWifiName(wifiInfo: WifiInfo){
    connectedWifiName = wifiInfo.ssid.replace("\"", "")
}
© www.soinside.com 2019 - 2024. All rights reserved.