ConnectivityManager getNetworkInfo (int) không dùng nữa


143

Sử dụng compileSdkVersion 23 , tuy nhiên, cố gắng hỗ trợ cho đến tận 9.

getNetworkInfo(int)đã không được chấp nhận trong 23. Đề xuất là sử dụng getAllNetworks()getNetworkInfo(Network)thay vào đó. Tuy nhiên cả hai đều yêu cầu tối thiểu API 21.

Có một lớp mà chúng ta có thể sử dụng trong gói hỗ trợ có thể hỗ trợ việc này không?

Tôi biết rằng một giải pháp đã được đề xuất trước đây , tuy nhiên, thách thức về các yêu cầu API tối thiểu của tôi là 9 đặt ra một vấn đề.


bạn có thể kiểm tra phiên bản xây dựng trong thời gian chạy và sử dụng phương pháp thích hợp
stinepike

1
Điều này sẽ vẫn ném một cảnh báo không dùng nữa?
kyleED

Vui lòng kiểm tra lớp ConnectivityObserver của tôi , gói các phương thức API bên dưới và trên Android Nougat.
JJD

Câu trả lời:


165

Bạn có thể dùng:

getActiveNetworkInfo ();

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
        // connected to wifi
    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
        // connected to mobile data
    }
} else {
    // not connected to the internet
}

Hoặc trong trường hợp chuyển đổi

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) { 
    // connected to the internet
    switch (activeNetwork.getType()) {
        case ConnectivityManager.TYPE_WIFI:
            // connected to wifi
            break;
        case ConnectivityManager.TYPE_MOBILE:
            // connected to mobile data
            break;
        default:
            break;
    }
} else {
    // not connected to the internet
}

1
@ShirishHerwade - Có, Bộ thu phát sóng là không cần thiết trong trường hợp này. getActiveNetworkInfo () có thể được đặt trong phương thức riêng của nó với điều kiện bao gồm một tham chiếu ngữ cảnh.
Bánh mì phô mai

1
@TheIT - Có doc nói "Bạn phải luôn kiểm tra isConnected () trước khi bắt đầu lưu lượng truy cập mạng". Giải pháp này không bắt đầu lưu lượng truy cập và chỉ cung cấp giải pháp cho lệnh gọi getNetworkInfo () không dùng nữa.
Bánh mì phô mai

7
Kể từ Android 9, SDK 28 hiện không còn dùng nữa.
Zbarcea Christian

32
activeNetwork.getType()không được tán thành và ConnectivityManager.TYPE_WIFIkhông được chấp nhận
Godwin

7
Thay thế bây giờcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

63

Còn tháng 10 năm 2018, câu trả lời được chấp nhận bị phản đối.

getType()và bản thân các loại, hiện không được chấp nhận trong API cấp 28. Từ Javadoc:

Người gọi nên chuyển sang kiểm tra NetworkCapabilities # hasTransport thay vào đó bằng một trong các hằng số NetworkCapabilities # TRANSPORT *

Để sử dụng NetworkCapabilities, bạn cần truyền một Networkthể hiện cho getNetworkCapabilities()phương thức. Để có được ví dụ đó, bạn cần gọi hàm getActiveNetwork()đã được thêm vào trong API cấp 23.

Vì vậy, tôi tin rằng bây giờ cách đúng đắn để kiểm tra an toàn xem bạn đã kết nối với Wi-Fi hay mạng di động là:

public static boolean isNetworkConnected() {
    final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT < 23) {
            final NetworkInfo ni = cm.getActiveNetworkInfo();

            if (ni != null) {
                return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
            }
        } else {
            final Network n = cm.getActiveNetwork();

            if (n != null) {
                final NetworkCapabilities nc = cm.getNetworkCapabilities(n);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } 
    }

    return false; 
}

Bạn cũng có thể kiểm tra các loại khác TRANSPORT, mà bạn có thể tìm thấy ở đây .

Lưu ý quan trọng: nếu bạn được kết nối với Wi-Fi VPN, thì trạng thái hiện tại của bạn có thể là TRANSPORT_VPN, vì vậy bạn cũng có thể muốn kiểm tra nó.

Đừng quên thêm quyền sau vào tệp AndroidManifest của bạn:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Liệu hasTransport (NetworkCapabilities.TRANSPORT_WIFI) có tương đương với ni.isConnected () && (ni.getType () == ConnnectivityManager.TYPE_WIFI) không? Ý tôi là hàm hasTransport () cũng kiểm tra xem thiết bị đã được kết nối hay đang cố kết nối chưa?
Bánh quy

Một lần nữa, NetworkInfobị khấu hao, bạn không thể sử dụng được nữa NetWorkInfo, vậy làm thế nào để cung cấp một sự thay thế?
Prescott Chartier

@PrescottChartier đoạn mã này chỉ truy cập NetworkInfo trên SDK <23 thiết bị
Tom

59

Cập nhật tháng 2 năm 2020:

Câu trả lời được chấp nhận bị phản đối một lần nữa 28 (Android P), nhưng phương pháp thay thế của nó chỉ hoạt động trên 23 (Android M). Để hỗ trợ các thiết bị cũ hơn, tôi đã viết một hàm trợ giúp.

Cách sử dụng:

int type = getConnectionType(getApplicationContext());

Nó trả về một int, bạn có thể thay đổi nó thành enummã của bạn:

0: Không có Internet (có thể ở chế độ máy bay hoặc trong quá trình tham gia mạng không dây).

1: Di động (dữ liệu di động, 3G / 4G / LTE bất cứ điều gì).

2: Wi-fi.

3: VPN

Bạn có thể sao chép phiên bản Kotlin hoặc phiên bản Java của hàm trợ giúp.

Kotlin:

@IntRange(from = 0, to = 3)
fun getConnectionType(context: Context): Int {
    var result = 0 // Returns connection type. 0: none; 1: mobile data; 2: wifi
    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm?.run {
            cm.getNetworkCapabilities(cm.activeNetwork)?.run {
                if (hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1
                } else if (hasTransport(NetworkCapabilities.TRANSPORT_VPN)){
                    result = 3
                }
            }
        }
    } else {
        cm?.run {
            cm.activeNetworkInfo?.run {
                if (type == ConnectivityManager.TYPE_WIFI) {
                    result = 2
                } else if (type == ConnectivityManager.TYPE_MOBILE) {
                    result = 1
                } else if(type == ConnectivityManager.TYPE_VPN) {
                    result = 3
                }
            }
        }
    }
    return result
}

Java:

@IntRange(from = 0, to = 3)
public static int getConnectionType(Context context) {
    int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = 2;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = 1;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                    result = 3;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = 2;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = 1;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN) {
                    result = 3;
                }
            }
        }
    }
    return result;
}

1
Khi bạn có 2 kết quả có thể, tốt hơn là sử dụng boolean thay vì trả về một số nguyên ...
Christian

3
@Christian Như đã giải thích trong phần màu vàng, chức năng helper này trả về 3 trạng thái có thể: No Internet, CellularWi-Fi. Nếu bạn không quan tâm đến loại kết nối, vui lòng sửa đổi mã cho phù hợp với ứng dụng của bạn.
dùng1032613

1
Điều gì về nhận xét trong giải pháp trên "nếu bạn được kết nối với Wi-Fi và với VPN, thì trạng thái hiện tại của bạn có thể là TRANSPORT_VPN, vì vậy bạn cũng có thể muốn kiểm tra nó."?
David

1
@Lukas bạn phải cẩn thận nếu bạn sử dụng Booleanlớp bao bọc thay vì booleanđó là nguyên thủy. Trong câu lệnh if, bạn sẽ phải thêm kiểm tra null. Ngoài ra, nếu ngày mai một chế độ Giao thông mới khác trong NetworkCapabilities được giới thiệu ... vì vậy sử dụng số nguyên để phân nhánh sẽ giúp ích và bạn cũng có thể sử dụng các trường hợp chuyển đổi.
Shadow Droid

3
tôi mệt mỏi với chu kỳ
khấu hao

16

Câu trả lời cập nhật (19: 07: 2018):

Phương pháp này sẽ giúp bạn kiểm tra nếu kết nối internet có sẵn.

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (connectivityManager != null) {
        NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
        return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
    } else {
        return false;
    }
}

Câu trả lời cũ:

Đối với thực hành tái sử dụng mã tốt nhất, ngẫu hứng trả lời Cheese Bread.

public static boolean isNetworkAvailable(Context context) {
    int[] networkTypes = {ConnectivityManager.TYPE_MOBILE,
            ConnectivityManager.TYPE_WIFI};
    try {
        ConnectivityManager connectivityManager =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        for (int networkType : networkTypes) {
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetworkInfo != null &&
                    activeNetworkInfo.getType() == networkType)
                return true;
        }
    } catch (Exception e) {
        return false;
    }
    return false;
}

Mã này có thể được đặt trong lớp Util và có thể được sử dụng để kiểm tra xem điện thoại có được kết nối với Internet qua Wifi hoặc Internet di động từ bất kỳ phần nào trong ứng dụng của bạn không.


3
Tôi khuyên bạn nên di chuyển mạng hoạt động bên ngoài vòng lặp for.
shtolik

20
activeNetwork.isConnectedOrConnecting()hiện không được chấp nhận
MHSFisher

1
Tôi thay đổi activeNetwork.isConnectedOrConnecting () thành activeNetwork.isConnected
Murillo Comino

NetworkInfo hiện không được chấp nhận. Cần cập nhật lại!
Scott Bigss

13

Câu trả lời được chấp nhận bị phản đối trong phiên bản 28, vì vậy đây là giải pháp mà tôi đang sử dụng trong dự án của mình.

Trả về loại kết nối. sai: không có kết nối Internet; đúng: dữ liệu di động | | wifi

public static boolean isNetworkConnected(Context context) { 
    boolean result = false; 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}

2
activeNetwork.getType () cũng không được dùng nữa. Bạn có thể sử dụng activeNetwork.isConnected ();
Aman Verma

11

Có một bản cập nhật cho câu trả lời này vào tháng 3 năm 2020 hỗ trợ API.15 thông qua API.29, bạn có thể tìm thấy nó theo câu trả lời ban đầu

Trả lời tháng 2 năm 2019

Để kiểm tra xem bạn có trực tuyến không:

boolean isOnline() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
    }
    return activeNetwork != null;
}

Để có được loại kết nối internet trước / sau android M

void internetType() {
    // Checking internet connectivity
    ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = null;
    if (connectivityMgr != null) {
        activeNetwork = connectivityMgr.getActiveNetworkInfo();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities nc = connectivityMgr.getNetworkCapabilities(connectivityMgr.getActiveNetwork());
            if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                // connected to mobile data
            } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                // connected to wifi
            }
        } else {
            if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                // connected to wifi
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                // connected to mobile data
            }
        }
    }
}

Tất cả các trường hợp cần có quyền truy cập trạng thái mạng

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Cập nhật tháng 3 năm 2020

NetworkInfokhông được chấp nhận và kể từ API 29, chúng ta phải sử dụng ConnectivityManager.NetworkCallbackvới các cuộc gọi lại onAvailable()và thay đổi trạng thái mạng onLost().

Sử dụng:

  • Bạn có thể sử dụng thư viện này hoặc sử dụng trực tiếp lớp tiện ích dưới đây là một phần của thư viện này.

Đặc trưng

  • LifeCycl có ý thức bằng cách thực hiện LifecycleObserverđể tránh rò rỉ bộ nhớ bằng cách thực hiện một số thao tác dọn dẹp onDestroy().
  • Nó hỗ trợ từ API 15 (Ice Cream Sandwich) đến API 29 (Android Q)
  • Đối với các API trước API 21, nó sử dụng dựa trên ngữ cảnh BoradcastReceiverNetworkInfovà sử dụng ConnectivityManager.NetworkCallbackcho API 21 trở lên.
  • Khi cả WiFi và mạng di động đều bật, thì trình nghe kết nối sẽ không bị gián đoạn khi WiFi bị ngắt kết nối trong khi chuyển sang mạng di động.
  • Khi mạng di động được bật, thì trình nghe kết nối sẽ không bị gián đoạn khi WiFi được kết nối và là mạng hoạt động (vì đây là mạng ưu tiên).
  • Nếu bạn sẽ sử dụng thư viện, thì không cần phải có sự cho phép này android.permission.ACCESS_NETWORK_STATE; nhưng bạn phải bao gồm nó nếu bạn sẽ sử dụng lớp tiện ích.

Khả năng

  • Nhận trạng thái kết nối hiện tại (trực tuyến / ngoại tuyến).
  • Kiểm tra / nghe liên tục kết nối internet và kích hoạt cuộc gọi lại khi thiết bị ngoại tuyến hoặc trực tuyến.
  • Lấy loại kết nối internet đang hoạt động (WiFi hoặc Cellular).
  • Lấy loại của tất cả các mạng có sẵn (WiFi hoặc Di động). >> Chỉ được hỗ trợ trên API 21+
  • Nhận số lượng của tất cả các mạng khả dụng >> Chỉ được hỗ trợ trên API 21+
@RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
public class ConnectionUtil implements LifecycleObserver {

    private static final String TAG = "LOG_TAG";
    private ConnectivityManager mConnectivityMgr;
    private Context mContext;
    private NetworkStateReceiver mNetworkStateReceiver;

    /*
     * boolean indicates if my device is connected to the internet or not
     * */
    private boolean mIsConnected = false;
    private ConnectionMonitor mConnectionMonitor;


    /**
     * Indicates there is no available network.
     */
    private static final int NO_NETWORK_AVAILABLE = -1;


    /**
     * Indicates this network uses a Cellular transport.
     */
    public static final int TRANSPORT_CELLULAR = 0;


    /**
     * Indicates this network uses a Wi-Fi transport.
     */
    public static final int TRANSPORT_WIFI = 1;


    public interface ConnectionStateListener {
        void onAvailable(boolean isAvailable);
    }


    public ConnectionUtil(Context context) {
        mContext = context;
        mConnectivityMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        ((AppCompatActivity) mContext).getLifecycle().addObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mConnectionMonitor = new ConnectionMonitor();
            NetworkRequest networkRequest = new NetworkRequest.Builder()
                    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                    .build();
            mConnectivityMgr.registerNetworkCallback(networkRequest, mConnectionMonitor);
        }

    }


    /**
     * Returns true if connected to the internet, and false otherwise
     *
     * <p>
     * NetworkInfo is deprecated in API 29
     * https://developer.android.com/reference/android/net/NetworkInfo
     * <p>
     * getActiveNetworkInfo() is deprecated in API 29
     * https://developer.android.com/reference/android/net/ConnectivityManager#getActiveNetworkInfo()
     * <p>
     * getNetworkInfo(int) is deprecated as of API 23
     * https://developer.android.com/reference/android/net/ConnectivityManager#getNetworkInfo(int)
     */
    public boolean isOnline() {

        mIsConnected = false;

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            // Checking internet connectivity
            NetworkInfo activeNetwork = null;
            if (mConnectivityMgr != null) {
                activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
            }
            mIsConnected = activeNetwork != null;

        } else {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)

            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET))
                        mIsConnected = true;
                }
            }
        }

        return mIsConnected;

    }


    /**
     * Returns
     * <p> <p>
     * <p><p> NO_NETWORK_AVAILABLE >>> when you're offline
     * <p><p> TRANSPORT_CELLULAR >> When Cellular is the active network
     * <p><p> TRANSPORT_WIFI >> When Wi-Fi is the Active network
     * <p>
     */
    public int getActiveNetwork() {

        NetworkInfo activeNetwork = mConnectivityMgr.getActiveNetworkInfo(); // Deprecated in API 29
        if (activeNetwork != null)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                NetworkCapabilities capabilities = mConnectivityMgr.getNetworkCapabilities(mConnectivityMgr.getActiveNetwork());
                if (capabilities != null)
                    if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                        // connected to mobile data
                        return TRANSPORT_CELLULAR;

                    } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                        // connected to wifi
                        return TRANSPORT_WIFI;
                    }

            } else {
                if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { // Deprecated in API 28
                    // connected to mobile data
                    return TRANSPORT_CELLULAR;

                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { // Deprecated in API 28
                    // connected to wifi
                    return TRANSPORT_WIFI;
                }
            }
        return NO_NETWORK_AVAILABLE;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public int getAvailableNetworksCount() {

        int count = 0;

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Network[] allNetworks = mConnectivityMgr.getAllNetworks(); // added in API 21 (Lollipop)
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null)
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                            || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        count++;
            }

        }

        return count;
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public List<Integer> getAvailableNetworks() {

        List<Integer> activeNetworks = new ArrayList<>();

        Network[] allNetworks; // added in API 21 (Lollipop)
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            allNetworks = mConnectivityMgr.getAllNetworks();
            for (Network network : allNetworks) {
                NetworkCapabilities networkCapabilities = mConnectivityMgr.getNetworkCapabilities(network);
                if (networkCapabilities != null) {
                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI))
                        activeNetworks.add(TRANSPORT_WIFI);

                    if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
                        activeNetworks.add(TRANSPORT_CELLULAR);

                }
            }
        }

        return activeNetworks;
    }


    public void onInternetStateListener(ConnectionStateListener listener) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            mNetworkStateReceiver = new NetworkStateReceiver(listener);
            IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            mContext.registerReceiver(mNetworkStateReceiver, intentFilter);

        } else {
            mConnectionMonitor.setOnConnectionStateListener(listener);
        }
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        ((AppCompatActivity) mContext).getLifecycle().removeObserver(this);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (mConnectionMonitor != null)
                mConnectivityMgr.unregisterNetworkCallback(mConnectionMonitor);
        } else {
            if (mNetworkStateReceiver != null)
                mContext.unregisterReceiver(mNetworkStateReceiver);
        }

    }


    public class NetworkStateReceiver extends BroadcastReceiver {

        ConnectionStateListener mListener;

        public NetworkStateReceiver(ConnectionStateListener listener) {
            mListener = listener;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getExtras() != null) {

                NetworkInfo activeNetworkInfo = mConnectivityMgr.getActiveNetworkInfo(); // deprecated in API 29

                /*
                 * activeNetworkInfo.getState() deprecated in API 28
                 * NetworkInfo.State.CONNECTED deprecated in API 29
                 * */
                if (!mIsConnected && activeNetworkInfo != null && activeNetworkInfo.getState() == NetworkInfo.State.CONNECTED) {
                    Log.d(TAG, "onReceive: " + "Connected To: " + activeNetworkInfo.getTypeName());
                    mIsConnected = true;
                    mListener.onAvailable(true);

                } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
                    if (!isOnline()) {
                        mListener.onAvailable(false);
                        mIsConnected = false;
                    }

                }

            }
        }
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public class ConnectionMonitor extends ConnectivityManager.NetworkCallback {

        private ConnectionStateListener mConnectionStateListener;

        void setOnConnectionStateListener(ConnectionStateListener connectionStateListener) {
            mConnectionStateListener = connectionStateListener;
        }

        @Override
        public void onAvailable(@NonNull Network network) {

            if (mIsConnected)
                return;

            Log.d(TAG, "onAvailable: ");

            if (mConnectionStateListener != null) {
                mConnectionStateListener.onAvailable(true);
                mIsConnected = true;
            }

        }

        @Override
        public void onLost(@NonNull Network network) {

            if (getAvailableNetworksCount() == 0) {
                mConnectionStateListener.onAvailable(false);
                mIsConnected = false;
            }

        }

    }

}

@Rasel vui lòng kiểm tra câu trả lời cập nhật, hy vọng nó có thể giúp
Zain

Nếu người dùng được kết nối với Wifi và dữ liệu di động cùng một lúc và mất kết nối ở một trong số họ onLostsẽ được gọi. onLostkhông có nghĩa là thiết bị bị mất kết nối internet, nhưng Mạng bị mất kết nối.
Gokhan Arik

@Gokhan Arik .. Rất vui khi tôi đang giải quyết nó
Zain


@GokhanArik cảm ơn vì đã giúp đỡ .. Tôi vừa cập nhật câu trả lời của mình và mở rộng sử dụng API, xin vui lòng cho tôi biết nếu bạn nhận thấy bất kỳ lỗi nào
Zain

4

Thật tốt khi kiểm tra xem mạng của bạn có được kết nối với Internet hay không:

@Suppress("DEPRECATION")
fun isNetworkAvailable(context: Context): Boolean {
    try {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        return if (Build.VERSION.SDK_INT > 22) {
            val an = cm.activeNetwork ?: return false
            val capabilities = cm.getNetworkCapabilities(an) ?: return false
            capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        } else {
            val a = cm.activeNetworkInfo ?: return false
            a.isConnected && (a.type == ConnectivityManager.TYPE_WIFI || a.type == ConnectivityManager.TYPE_MOBILE)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return false
}

Bạn cũng có thể muốn kiểm tra NetworkCapabilities.NET_CAPABILITY_VALIDATED.
JJD

3

Phiên bản Kotlin:

fun isInternetOn(context: Context): Boolean {
   val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
   val activeNetwork = cm?.activeNetworkInfo
   return activeNetwork != null && activeNetwork.isConnected
}

3

Như Cheese Bread đã đề xuất , hãy sử dụng getActiveNetworkInfo ()

getActiveNetworkInfo

Đã thêm trong API cấp 1

NetworkInfo getActiveNetworkInfo ()

Trả về chi tiết về mạng dữ liệu mặc định hiện đang hoạt động. Khi được kết nối, mạng này là tuyến mặc định cho các kết nối đi. Bạn phải luôn kiểm tra isConnected () trước khi bắt đầu lưu lượng mạng. Điều này có thể trả về null khi không có mạng mặc định. Phương pháp này yêu cầu người gọi giữ quyền ACCESS_NETWORK_STATE. Trả về NetworkInfo một đối tượng NetworkInfo cho mạng mặc định hiện tại hoặc null nếu không có mạng mặc định nào đang hoạt động.

Tham khảo: Studio Android

 public final boolean isInternetOn() {

    // get Connectivity Manager object to check connection
    ConnectivityManager connec =
            (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);

    // Check for network connections
    if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED ||
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) {

        // if connected with internet

        Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show();
        return true;

    } else if (
            connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                    connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED  ) {

        Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show();
        return false;
    }
    return false;
}

Bây giờ gọi phương thức, để sử dụng an toàn hãy thử bắt

try {
    if (isInternetOn()) { /* connected actions */ }
    else { /* not connected actions */ }
} catch (Exception e){
  Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}

Và đừng quên thêm:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

cảm ơn bạn rất hữu ích khi chúng tôi kiểm tra trạng thái mạng và nếu cả wifi và dữ liệu đều bị tắt - thì ứng dụng đó đã bị sập nhưng hãy thử giải quyết vấn đề ..
Rucha Bhatt Joshi

Tuy nhiên, điều này không hoạt động nếu tôi muốn kiểm tra xem một loại mạng cụ thể có hiện diện liệt kê tất cả các mạng hiện tại hay không, tức làgetNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
m0skit0

3
getState () không dùng nữa!
Diego Venâncio

Một số hướng dẫn không dùng nữa!
Scott Bigss

2

Để đảm bảo an toàn, tôi cũng đề nghị sử dụng phương pháp này

NetworkInfo.isConnected ()

Toàn bộ phương pháp có thể như sau:

/**
 * Checking whether network is connected
 * @param context Context to get {@link ConnectivityManager}
 * @return true if Network is connected, else false
 */
public static boolean isConnected(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
        int networkType = activeNetwork.getType();
        return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE;
    } else {
        return false;
    }
}

9
activeNetwork.getType()không được tán thành và ConnectivityManager.TYPE_WIFI không được chấp nhận
Godwin

2

Dưới đây là cách tôi kiểm tra xem mạng hiện tại có sử dụng di động hay không trên các phiên bản Android mới nhất:

val isCellular: Boolean get() {
    val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
    } else {
        cm.activeNetworkInfo?.type == ConnectivityManager.TYPE_MOBILE
    }
}

2

(Hầu hết) Tất cả các câu trả lời đều không được chấp nhận trong Android P, vì vậy đây là C#giải pháp ( rất dễ thực hiện cho các nhà phát triển Java )

public bool IsOnline(Context context)
{
    var cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);

    if (cm == null) return false;

    if (Build.VERSION.SdkInt < BuildVersionCodes.M)
    {
        var ni = cm.ActiveNetworkInfo;

        if (ni == null) return false;

        return ni.IsConnected && (ni.Type == ConnectivityType.Wifi || ni.Type == ConnectivityType.Mobile);
    }

    return cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Wifi)
        || cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Cellular);
}   

Chìa khóa ở đây là Android.Net.TransportType


Aaaannnndddd mọi thứ trong này là TIẾP TỤC!
Prescott Chartier

@PrescottChartier ở phiên bản nào?
Mehdi Dehghani

2

Chúng tôi có thể cần kiểm tra kết nối internet nhiều lần. Vì vậy, sẽ dễ dàng hơn cho chúng ta nếu chúng ta viết khối mã theo phương thức mở rộng Context. Dưới đây là phần mở rộng trợ giúp của tôi cho ContextFragment.

Kiểm tra kết nối Internet

fun Context.hasInternet(): Boolean {
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    return if (Build.VERSION.SDK_INT < 23) {
        val activeNetworkInfo = connectivityManager.activeNetworkInfo
        activeNetworkInfo != null && activeNetworkInfo.isConnected
    } else {
        val nc = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (nc == null) {
            false
        } else {
            nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                    nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
        }
    }
}

Các phần mở rộng khác

fun Context.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) {
    if (hasInternet()) {
        trueFunc(true)
    } else if (notifyNoInternet) {
        Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show()
    }
}

fun Context.hasInternet(
    trueFunc: (internet: Boolean) -> Unit,
    falseFunc: (internet: Boolean) -> Unit
) {
    if (hasInternet()) {
        trueFunc(true)
    } else {
        falseFunc(true)
    }
}

fun Fragment.hasInternet(): Boolean = context!!.hasInternet()

fun Fragment.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) =
    context!!.hasInternet(notifyNoInternet, trueFunc)

fun Fragment.hasInternet(
    trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit
) = context!!.hasInternet(trueFunc, falseFunc)

2

kiểm tra xem Internet có sẵn không

@RequiresPermission(allOf = [
    Manifest.permission.ACCESS_NETWORK_STATE, 
    Manifest.permission.INTERNET
])
fun isInternetAvailable(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
    val activeNetworkInfo = connectivityManager!!.activeNetworkInfo
    return activeNetworkInfo != null && activeNetworkInfo.isConnected
}

2

ConnectionManager.getActiveNetwork () không được tìm thấy trong Android M (API 28) bên dưới. networkInfo.getState () không dùng nữa trên Android L.

Vì vậy, câu trả lời cuối cùng là:

public static boolean isConnectingToInternet(Context mContext) {
    if (mContext == null) return false;

    ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            final Network network = connectivityManager.getActiveNetwork();
            if (network != null) {
                final NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network);

                return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                        nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
            }
        } else {
            NetworkInfo[] networkInfos = connectivityManager.getAllNetworkInfo();
            for (NetworkInfo tempNetworkInfo : networkInfos) {
                if (tempNetworkInfo.isConnected()) {
                    return true;
                }
            }
        }
    }
    return false;
}

1
Bạn nói getActiveNetwork () không được tìm thấy trong Android bên dưới M, nhưng mã của bạn sử dụng nó trên Lollipop!?
3c71

2

Nhiều câu trả lời vẫn sử dụng getNetworkType dưới 23 không được chấp nhận; sử dụng mã dưới đây để kiểm tra xem thiết bị có kết nối internet không.

public static boolean isNetworkConnected(Context context) {

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    if (cm != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
        } else {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            return activeNetwork != null && activeNetwork.isConnected();
        }
    }

    return false;
}

..

Và đừng quên thêm dòng này vào Manifest

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

1

Vì các câu trả lời được đăng chỉ cho phép bạn truy vấn mạng đang hoạt động, đây là cách nhận được NetworkInfocho bất kỳ mạng nào, không chỉ mạng đang hoạt động (ví dụ: mạng Wifi) (xin lỗi, mã Kotlin phía trước)

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run {
    allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) }
//    getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21
}

Điều này yêu cầu API 21 trở lên và sự cho phép android.permission.ACCESS_NETWORK_STATE


1
currentNetwork.getType () và ConnectivityManager.TYPE_WIFI đều không được dùng trong API 28.
Abushawish

@Abushawish Giải pháp được đề xuất cho API 28 là gì?
tmm1

Thay thế bây giờcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

1

NetManager mà bạn có thể sử dụng để kiểm tra kết nối internet trên Android với Kotlin

Nếu bạn sử dụng minSdkVersion> = 23

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet() = isConnected(getNetworkCapabilities(activeNetwork))

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}

Nếu bạn sử dụng minSdkVersion <23

class NetManager @Inject constructor(var applicationContext: Context) {
    val isConnectedToInternet: Boolean?
        get() = with(
            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
                    as ConnectivityManager
        ) {
            isConnectedToInternet()
        }
}

fun ConnectivityManager.isConnectedToInternet(): Boolean = if (Build.VERSION.SDK_INT < 23) {
    isConnected(activeNetworkInfo)
} else {
    isConnected(getNetworkCapabilities(activeNetwork))
}


fun isConnected(network: NetworkInfo?): Boolean {
    return when (network) {
        null -> false
        else -> with(network) { isConnected && (type == TYPE_WIFI || type == TYPE_MOBILE) }
    }
}

fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
    return when (networkCapabilities) {
        null -> false
        else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
    }
}

1

https://www.agnellectdev.com/content/how-detect-network-connectivity-android

xin vui lòng làm theo hướng dẫn này nó sẽ giúp bất cứ ai tìm kiếm câu trả lời.

lưu ý networkInfo không được dùng nữa vì thế thay vào đó là isNetworkReachizable () bằng câu trả lời @vidha bên dưới chuyển getApplicationContext () làm tham số

  public static boolean isNetworkReacheable(Context context) {
    boolean result = false;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (cm != null) {
            NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
            if (capabilities != null) {
                if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    result = true;
                } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    result = true;
                }
            }
        }
    } else {
        if (cm != null) {
            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork != null) {
                // connected to the internet
                if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
                    result = true;
                } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
                    result = true;
                }
            }
        }
    }
    return result;
}

0
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();
    }
}

0

Điều này làm việc cho tôi trong Kotlin. Rất nhiều API bị phản đối trong lớp Trình quản lý mạng, vì vậy câu trả lời bên dưới bao gồm tất cả các hỗ trợ API.

fun isNetworkAvailable(context: Context): Boolean {
    var result = false
    (context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                result = isCapableNetwork(this,this.activeNetwork)
            } else {
                val networkInfos = this.allNetworks
                for (tempNetworkInfo in networkInfos) {
                    if(isCapableNetwork(this,tempNetworkInfo))
                        result =  true
                }
            }
        }

    return result
}

fun isCapableNetwork(cm: ConnectivityManager,network: Network?): Boolean{
     cm.getNetworkCapabilities(network)?.also {
        if (it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            return true
        } else if (it.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            return true
        }
    }
    return false
}

Bạn cũng sẽ thêm vào bên dưới

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

0

Đoạn mã dưới đây hoạt động trên tất cả các API. (Kotlin)

Tuy nhiên, getActiveNetworkInfo () không được dùng nữa trong API 29 và hoạt động trên tất cả các API, vì vậy chúng tôi có thể sử dụng nó trong tất cả các Api dưới 29

fun isInternetAvailable(context: Context): Boolean {
            var result = false
            val connectivityManager =
                context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val networkCapabilities = connectivityManager.activeNetwork ?: return false
                val actNw =
                    connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
                result = when {
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
                    actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
                    else -> false
                }
            } else {
                connectivityManager.run {
                    connectivityManager.activeNetworkInfo?.run {
                        result = when (type) {
                            ConnectivityManager.TYPE_WIFI -> true
                            ConnectivityManager.TYPE_MOBILE -> true
                            ConnectivityManager.TYPE_ETHERNET -> true
                            else -> false
                        }

                    }
                }
            }

            return result
        }

0

Một cái gì đó như thế này:

public boolean hasConnection(final Context context){
    ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNW = cm.getActiveNetworkInfo();
    if (activeNW != null && activeNW.isConnected())
    {
        return true;
    }
    return false;
}

Và trong cơ thể chương trình chính:

if(hasConnection(this)) {
    Toast.makeText(this, "Active networks OK ", Toast.LENGTH_LONG).show();
    getAccountData(token, tel);
}
else  Toast.makeText(this, "No active networks... ", Toast.LENGTH_LONG).show();

0

Điều này cũng sẽ hoạt động trong Android 10. Nó sẽ trả về true nếu kết nối với internet khác trả về false.

private fun isOnline(): Boolean {
        val connectivityManager =
                getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val capabilities =
                connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
        if (capabilities != null) {
            when {
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_CELLULAR")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_WIFI")
                    return true
                }
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                    Log.i("Internet", "NetworkCapabilities.TRANSPORT_ETHERNET")
                    return true
                }
            }
        }
        return false
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.