什么是Android P API 28中不推荐使用的ConnectivityManager.TYPE_WIFI的替代方法?

Amr*_*rut 9 android android-sdk-manager android-api-levels

在Android P API 28中不推荐使用ConnectivityManager.TYPE_WIFI。此外,也不推荐使用NetworkInfo#getTypeConnectivityManager.TYPE_MOBILE

那么,有什么替代方案呢?我知道我们必须使用NetworkCapabilities类中的方法。但是,我无法将所有内容合并到一个地方,例如如何在NetworkCapabilities类中进行getType()以及如何在其上添加WIFI和蜂窝数据检查?

请协助。

Chi*_*oni 8

您可以使用以下代码段检查您是否具有Wifi连接或蜂窝网络:

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
    Network network = connectivityManager.getActiveNetwork();
    NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
    return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
}
Run Code Online (Sandbox Code Playgroud)


Sye*_*han 8

使用以下方法.. 19/06/2019

public boolean isconnectedToWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) {
        return false;
    }

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        if (capabilities == null) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    } else {
        NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (networkInfo == null) {
            return false;
        }
        return networkInfo.isConnected();
    }
}
Run Code Online (Sandbox Code Playgroud)


Int*_*iya 6

ConnectivityManager.TYPE_WIFI弃用。你应该使用NetworkCapabilities.

这取代了旧ConnectivityManager.TYPE_MOBILE的网络选择方法。与其表明对 Wi-Fi 的需求,因为应用程序需要高带宽并在出现新的、快速的网络(如 LTE)时有过时的风险,应用程序应指明它需要高带宽。类似地,如果应用程序需要非计量网络进行批量传输,它可以指定而不是假设所有基于蜂窝的连接都已计量而所有基于 Wi-Fi 的连接都不是。

应用程序应改为使用NetworkCapabilities.hasTransport(int)requestNetwork(NetworkRequest, NetworkCallback)请求适当的网络。对于支持的传输。

你可以试试这个方法

NetworkAgentInfo networkAgent;
int type = ConnectivityManager.TYPE_NONE;
if (networkAgent.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
     type = ConnectivityManager.TYPE_MOBILE;
} else if (networkAgent.networkCapabilities.hasTransport(
     NetworkCapabilities.TRANSPORT_WIFI)) {
     type = ConnectivityManager.TYPE_WIFI;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案缺少一个重要的步骤......如何获得“networkAgent”? (3认同)
  • 什么是 NetworkAgetInfo?而且,您再次使用已弃用的 ConnectivityManager.TYPE_WIFI (2认同)