首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SDK22中已弃用NetworkInfo和WifiConfiguration

SDK22中已弃用NetworkInfo和WifiConfiguration
EN

Stack Overflow用户
提问于 2021-07-09 21:09:22
回答 1查看 174关注 0票数 0

我在PAX A920设备上使用安卓棒棒糖(SDK版本22)。在构建时,我收到类似如下的警告消息:

NetworkInfo in android.net has been deprecated

WifiConfiguration in android.net has been deprecated

我很困惑,因为我在C:\Users\{YOUR_ACCOUNT}\AppData\Local\Android\Sdk\sources\android-22\com\android\connectivitymanagertest中看到了一个使用该方法访问wifi的SDK22示例,但为什么它似乎被弃用了?

用什么方法来替换过时的方法呢?

代码语言:javascript
运行
复制
public boolean isWifiConnected() {
    boolean isWifiConnected = false;
    try {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo != null) {
            isWifiConnected = networkInfo.getState() == CONNECTED;
        }
        Log.i(TAG, "wifi adapter is connected? " + isWifiConnected);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return isWifiConnected;
}

public void removeNetwork() {
    List<WifiConfiguration> wifiCfgList = wifiManager.getConfiguredNetworks();
    if (wifiCfgList.size() > 0) {
        for (WifiConfiguration item : wifiCfgList) {
            if (item != null) {
                wifiManager.removeNetwork(item.networkId);
                wifiManager.saveConfiguration();
            }
        }
    }
}

谢谢你的指点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 21:33:49

不推荐使用的类使用ConnectivityManager系统服务和NetworkCallbackshttps://developer.android.com/training/monitoring-device-state/connectivity-status-type进行了重新调整

尽管官方代码示例展示了如何从ConnectivityManager获取NetworkInfo,但仍有一个突出显示的注释:

下面是一个示例代码,说明如何获取当前网络状态并随时间推移接收更新。这是一个部分精简的解决方案,我将在生产中使用。如果您使用RxJava或RxKotlin连接它,您可以创建一个保存网络状态的可观察对象,并在调用被覆盖的NetworkCallback get方法时更新该对象。

关于Java的注意事项:公共类级变量是为了简洁而公开的。相反,我会为这些变量创建几个getter来访问这些变量背后的值。

请随时提问。

Java

代码语言:javascript
运行
复制
class NetworkReachabilityService {

    public NetworkType networkType;
    public NetworkState networkState = NetworkState.Unavailable;
    private ConnectivityManager connectivityManager;
    private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            updateAvailability(connectivityManager.getNetworkCapabilities(network));
        }

        @Override
        public void onLosing(@NonNull Network network, int maxMsToLive) {
            super.onLosing(network, maxMsToLive);
            networkState = NetworkState.Losing;
        }

        @Override
        public void onLost(@NonNull Network network) {
            super.onLost(network);
            networkState = NetworkState.Lost;
        }

        @Override
        public void onUnavailable() {
            super.onUnavailable();
            networkState = NetworkState.Unavailable;
        }

        @Override
        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            updateAvailability(networkCapabilities);
        }
    };

    public NetworkReachabilityService(Context context) {
        connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    }

    private void updateAvailability(NetworkCapabilities networkCapabilities) {
        if (networkCapabilities == null) {
            networkState = NetworkState.Unavailable;
            return;
        }

        if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            networkType = NetworkType.CELL;
        } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            networkType = NetworkType.WiFi;
        }

        networkState = NetworkState.Available;
    }

    public void resumeListeningNetworkChanges() {
        pauseListeningNetworkChanges();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            connectivityManager.registerDefaultNetworkCallback(networkCallback);
        } else {
            connectivityManager.registerNetworkCallback(
                    new NetworkRequest.Builder().build(),
                    networkCallback
            );
        }
    }

    public void pauseListeningNetworkChanges() {
        try {
            connectivityManager.unregisterNetworkCallback(networkCallback);
        } catch (IllegalArgumentException exception) {
            // Usually happens only once if: "NetworkCallback was not registered"
        }
    }

    private enum NetworkState {
        Available, Unavailable, Connecting, Losing, Lost
    }

    private enum NetworkType {
        WiFi, CELL, OTHER
    }
}

Kotlin

代码语言:javascript
运行
复制
sealed class NetworkState {
    data class Available(val type: NetworkType) : NetworkState()
    object Unavailable : NetworkState()
    object Connecting : NetworkState()
    object Losing : NetworkState()
    object Lost : NetworkState()
}

sealed class NetworkType {
    object WiFi : NetworkType()
    object CELL : NetworkType()
    object OTHER : NetworkType()
}

class NetworkReachabilityService private constructor(context: Context) {
    
    private val connectivityManager: ConnectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        // There are more functions to override!

        override fun onLost(network: Network) {
            super.onLost(network)
            networkState = NetworkState.Lost
        }

        override fun onUnavailable() {
            super.onUnavailable()
            networkState = NetworkState.Unavailable
        }

        override fun onLosing(network: Network, maxMsToLive: Int) {
            super.onLosing(network, maxMsToLive)
            networkState = NetworkState.Losing
        }

        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            updateAvailability(connectivityManager.getNetworkCapabilities(network))
        }

        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            super.onCapabilitiesChanged(network, networkCapabilities)
            updateAvailability(networkCapabilities)
        }
    }
    
    var networkState: NetworkState = NetworkState.Unavailable
        private set

    private fun updateAvailability(networkCapabilities: NetworkCapabilities?) {
        if (networkCapabilities == null) {
            networkState = NetworkState.Unavailable
            return
        }
        var networkType: NetworkType = NetworkType.OTHER

        if (networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
            networkType = NetworkType.CELL
        }
        if (networkCapabilities.hasTransport(TRANSPORT_WIFI)) {
            networkType = NetworkType.WiFi
        }

        networkState = NetworkState.Available(networkType)
    }

    fun pauseListeningNetworkChanges() {
        try {
            connectivityManager.unregisterNetworkCallback(networkCallback)
        } catch (e: IllegalArgumentException) {
            // Usually happens only once if: "NetworkCallback was not registered"
        }
    }

    fun resumeListeningNetworkChanges() {
        pauseListeningNetworkChanges()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            connectivityManager.registerDefaultNetworkCallback(networkCallback)
        } else {
            connectivityManager.registerNetworkCallback(
                NetworkRequest.Builder().build(),
                networkCallback
            )
        }
    }
}

要开始接收网络状态更新,请分别调用resumeListeningNetworkChanges和停止pauseListeningNetworkChanges

更新:如何在废弃的和新的API之间切换

请注意,即使您使用此解决方案,您仍然会收到一条消息,表明您使用的某些代码已弃用!只要您提供了一个可以在新API和旧的、过时的API之间切换的实现,它就完全没有问题,并且不会被认为是错误。

这是一个近似的解决方案。因为新类是在API level 29中添加的,所以我们必须使用Build.VERSION_CODES.Q,因为它是一个值为29的整数。

代码语言:javascript
运行
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {         
   // Use new API here
} else {
   // Use old API here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68317355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档