当我想通过 WifiManager.connectionInfo 获取有关当前 wifi 连接的信息时,我得到 这个:
“connectionInfo 的 getter:WifiInfo!”已弃用。在 Java 中已弃用
如何在 Android 12 中做到这一点? (只想获取RSSI)
从 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()
/**
* 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("\"", "")
}