ConnectivityManager getNetworkInfo (int) sudah tidak digunakan lagi


144

Menggunakan compileSdkVersion 23 , namun mencoba mendukung sejauh 9.

getNetworkInfo(int)dihentikan pada 23. Sarannya adalah untuk menggunakan getAllNetworks()dan getNetworkInfo(Network)sebagai gantinya. Namun keduanya membutuhkan minimum API 21.

Apakah ada kelas yang bisa kita gunakan dalam paket dukungan yang dapat membantu dengan ini?

Saya tahu bahwa suatu solusi telah diusulkan sebelumnya , namun tantangan persyaratan API minimum 9 saya menimbulkan masalah.


Anda dapat memeriksa versi build saat runtime dan menggunakan metode yang sesuai
stinepike

1
Apakah ini masih akan membuang peringatan yang sudah usang?
kyleED

Silakan checkout kelas ConnectivityObserver saya yang merangkum metode API di bawah dan di atas Android Nougat.
JJD

Jawaban:


166

Kamu bisa memakai:

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
}

Atau dalam switch case

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 - Ya Penerima Siaran tidak diperlukan dalam kasus ini. getActiveNetworkInfo () dapat ditempatkan dalam metode sendiri asalkan referensi konteks disertakan.
Roti Keju

1
@TheIT - Ya, doc mengatakan "Anda harus selalu memeriksa isConnected () sebelum memulai lalu lintas jaringan". Solusi ini tidak memulai lalu lintas dan hanya memberikan solusi untuk panggilan getNetworkInfo () yang sudah usang.
Roti Keju

7
Pada Android 9, SDK 28 ini sekarang sudah usang.
Zbarcea Christian

32
activeNetwork.getType()sudah ditinggalkan dan ConnectivityManager.TYPE_WIFIditinggalkan
Godwin

7
Penggantian sekarangcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

63

Sedangkan untuk Oktober 2018, jawaban yang diterima sudah usang.

getType(), dan ketik sendiri, sekarang tidak digunakan lagi di API Level 28. Dari Javadoc:

Penelepon harus beralih untuk memeriksa NetworkCapabilities # hasTransport sebagai gantinya dengan salah satu konstanta NetworkCapabilities # TRANSPORT *

Untuk menggunakan NetworkCapabilities, Anda harus memberikan Networkturunan ke getNetworkCapabilities()metode. Untuk mendapatkan contoh itu, Anda perlu menelepon getActiveNetwork()yang ditambahkan di API Level 23.

Jadi saya percaya untuk saat ini cara yang tepat untuk memeriksa dengan aman apakah Anda terhubung ke Wi-Fi atau jaringan seluler adalah:

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; 
}

Anda juga dapat memeriksa jenis lain TRANSPORTyang dapat Anda temukan di sini .

Catatan penting: jika Anda terhubung ke Wi-Fi dan ke VPN, maka keadaan Anda saat ini bisa jadi TRANSPORT_VPN, jadi Anda mungkin ingin juga memeriksanya.

Jangan lupa untuk menambahkan izin berikut ke file AndroidManifest Anda:

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

Apakah hasTransport (NetworkCapabilities.TRANSPORT_WIFI) setara dengan ni.isConnected () && (ni.getType () == ConnnectivityManager.TYPE_WIFI)? Maksud saya adalah fungsi hasTransport () juga memeriksa apakah perangkat terhubung atau mencoba untuk terhubung?
Biskuit

Sekali lagi, NetworkInfodisusutkan, Anda tidak bisa lagi menggunakan NetWorkInfo, jadi bagaimana ini memberikan alternatif?
Prescott Chartier

@PrescottChartier, cuplikan kode ini hanya mengakses NetworkInfo di SDK <23 perangkat
Tom

59

Pembaruan Februari 2020:

Jawaban yang diterima sudah tidak digunakan lagi 28 (Android P), tetapi metode penggantiannya hanya berfungsi 23 (Android M). Untuk mendukung perangkat yang lebih lama, saya menulis fungsi pembantu di.

Cara Penggunaan:

int type = getConnectionType(getApplicationContext());

Ini mengembalikan sebuah int, Anda dapat mengubahnya ke enumdalam kode Anda:

0: Tidak ada Internet yang tersedia (mungkin dalam mode pesawat, atau sedang dalam proses bergabung dengan wi-fi).

1: Seluler (data seluler, 3G / 4G / LTE apa pun).

2: Wi-fi.

3: VPN

Anda dapat menyalin Kotler atau versi Java dari fungsi pembantu.

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
}

Jawa:

@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;
}

2
Karena Anda memiliki 2 hasil yang mungkin, lebih baik menggunakan boolean daripada mengembalikan bilangan bulat ...
Christian

3
@Christian Sebagaimana dijelaskan dalam bagian kuning, fungsi pembantu ini mengembalikan 3 negara mungkin: No Internet, Cellulardan Wi-Fi. Jika Anda tidak peduli dengan jenis koneksi, jangan ragu untuk memodifikasi kode agar sesuai dengan aplikasi Anda.
user1032613

1
bagaimana dengan komentar dalam solusi di atas "jika Anda terhubung ke Wi-Fi dan ke VPN, maka kondisi Anda saat ini bisa menjadi TRANSPORT_VPN, jadi Anda mungkin ingin juga memeriksanya."?
David

1
@Lukas Anda harus berhati-hati jika menggunakan Booleankelas pembungkus alih-alih booleanyang primitif. Dalam pernyataan if Anda harus menambahkan cek null. Juga bagaimana jika besok mode Transport baru lainnya di NetworkCapabilities diperkenalkan ... jadi menggunakan integer untuk percabangan akan membantu dan Anda juga bisa menggunakan switch case.
Shadow Droid

3
bosan dengan siklus penghentian konstan ini
Segun Wahaab

16

Jawaban yang diperbarui (19: 07: 2018):

Metode ini akan membantu Anda memeriksa apakah koneksi internet tersedia.

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;
    }
}

Jawaban lama:

Untuk praktik penggunaan ulang kode terbaik, improvisasi jawaban Roti Keju.

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;
}

Kode dapat ditempatkan di kelas Util dan dapat digunakan untuk memeriksa apakah ponsel terhubung ke Internet melalui Wifi atau Internet Seluler dari bagian mana pun dari aplikasi Anda.


3
Saya sarankan untuk pindah dari jaringan aktif di luar for for.
shtolik

20
activeNetwork.isConnectedOrConnecting()sekarang tidak digunakan lagi
MHSFisher

1
Saya mengubah activeNetwork.isConnectedOrConnecting () menjadi activeNetwork.isConnected
Murillo Comino

NetworkInfo sekarang sudah tidak digunakan lagi. Perlu memperbarui lagi!
Scott Biggs

13

Jawaban yang diterima sudah usang dalam versi 28 jadi di sini adalah solusi yang saya gunakan dalam proyek saya.

Mengembalikan jenis koneksi. false: tidak ada Koneksi Internet; true: data seluler || 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 () juga tidak digunakan lagi. Anda dapat menggunakan activeNetwork.isConnected ();
Aman Verma

11

Ada pembaruan untuk jawaban ini pada Maret 2020 yang mendukung API.15 hingga API.29, Anda dapat menemukannya mengikuti jawaban asli

Jawab Februari 2019

Untuk memeriksa apakah Anda sedang online:

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;
}

Untuk mendapatkan jenis konektivitas internet sebelum / sesudah 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
            }
        }
    }
}

Semua kasus memerlukan izin untuk mengakses kondisi jaringan

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

Pembaruan Maret 2020

Seperti yang NetworkInfosudah ditinggalkan dan pada API 29 dari sekarang kita harus menggunakan ConnectivityManager.NetworkCallbackdengan perubahan jaringan negara onAvailable()& onLost()panggilan balik.

Pemakaian:

  • Anda bisa menggunakan perpustakaan ini , atau langsung menggunakan kelas utilitas di bawah ini yang merupakan bagian dari perpustakaan ini.

fitur

  • Ini sadar akan LifeCycle dengan menerapkan LifecycleObserveruntuk menghindari kebocoran memori dengan melakukan beberapa onDestroy()metode pembersihan .
  • Ini mendukung dari API 15 (Ice Cream Sandwich) hingga API 29 (Android Q)
  • Untuk API sebelum API 21, ia menggunakan berbasis konteks BoradcastReceiverdan NetworkInfo, dan menggunakan ConnectivityManager.NetworkCallbackuntuk API 21 ke atas.
  • Ketika WiFi dan jaringan seluler aktif, maka pendengar konektivitas tidak akan menyela ketika WiFi terputus saat transisi ke jaringan seluler.
  • Ketika jaringan seluler aktif, maka pendengar konektivitas tidak akan menyela ketika WiFi terhubung dan menjadi jaringan aktif (karena ini adalah jaringan yang disukai).
  • Jika Anda akan menggunakan perpustakaan, maka tidak perlu menyertakan izin ini android.permission.ACCESS_NETWORK_STATE; tetapi Anda harus memasukkannya jika Anda akan menggunakan kelas utilitas.

Kemampuan

  • Dapatkan status konektivitas saat ini (online / offline).
  • Terus menerus memeriksa / mendengarkan koneksi internet dan memicu panggilan balik ketika perangkat menjadi offline atau online.
  • Dapatkan jenis koneksi internet aktif (WiFi atau Seluler).
  • Dapatkan jenis semua jaringan yang tersedia (WiFi atau Seluler). >> Hanya didukung di API 21+
  • Dapatkan jumlah semua jaringan yang tersedia >> Hanya didukung pada 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 silakan periksa jawaban yang diperbarui, harap ini bisa membantu
Zain

Jika pengguna terhubung ke Wifi dan data seluler pada saat yang sama, dan kehilangan koneksi di salah satunya onLostakan dipanggil. onLostbukan berarti perangkat kehilangan koneksi internet, tetapi Jaringan kehilangan koneksi.
Gokhan Arik

@ Gokhan Arik .. Tangkapan yang bagus Saya sedang mengerjakan penyelesaiannya
Zain


@GokhanArik terima kasih atas bantuannya .. Saya baru saja memperbarui jawaban saya dan memperluas penggunaan API, tolong beritahu saya jika Anda melihat ada bug
Zain

4

Baik untuk memeriksa apakah jaringan Anda terhubung ke Internet:

@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
}

Anda mungkin juga ingin memeriksa NetworkCapabilities.NET_CAPABILITY_VALIDATED.
JJD

3

Versi 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

Seperti yang disarankan Roti Keju , gunakan getActiveNetworkInfo ()

getActiveNetworkInfo

Ditambahkan di API level 1

NetworkInfo getActiveNetworkInfo ()

Mengembalikan detail tentang jaringan data default yang aktif saat ini. Saat terhubung, jaringan ini adalah rute default untuk koneksi keluar. Anda harus selalu memeriksa isConnected () sebelum memulai lalu lintas jaringan. Ini dapat mengembalikan nol ketika tidak ada jaringan standar. Metode ini mengharuskan pemanggil memegang izin ACCESS_NETWORK_STATE. Mengembalikan NetworkInfo objek NetworkInfo untuk jaringan default saat ini atau null jika tidak ada jaringan default yang aktif saat ini.

Referensi: Android Studio

 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;
}

sekarang panggil metode tersebut, untuk penggunaan yang aman coba tangkap

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

Dan jangan lupa tambahkan:

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

terima kasih bermanfaat. ketika kami memeriksa status jaringan dan jika wifi dan data keduanya mati - aplikasi waktu itu mogok tetapi coba tangkap menyelesaikan masalah ..
Rucha Bhatt Joshi

Namun ini tidak berfungsi jika saya ingin memeriksa apakah jenis jaringan tertentu hadir, getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
hitung

3
getState () sudah usang!
Diego Venâncio

Beberapa instruksi usang!
Scott Biggs

2

Agar berada di sisi yang aman, saya akan menyarankan untuk menggunakan metode juga

NetworkInfo.isConnected ()

Seluruh metode bisa seperti di bawah ini:

/**
 * 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()sudah ditinggalkan dan ConnectivityManager.TYPE_WIFI ditinggalkan
Godwin

2

Inilah cara saya memeriksa apakah jaringan saat ini menggunakan seluler atau tidak pada versi Android terbaru:

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

(Hampir) Semua jawaban sudah usang di Android P, jadi inilah C#solusinya ( yang mudah diikuti untuk pengembang 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);
}   

Kuncinya di sini adalah Android.Net.TransportType


Aaaannnndddd semuanya dalam hal ini DIHARAPKAN!
Prescott Chartier

@ PrescottChartier dalam versi apa?
Mehdi Dehghani

2

Kami mungkin perlu memeriksa konektivitas internet lebih dari sekali. Jadi akan lebih mudah bagi kita jika kita menulis blok kode dalam metode ekstensi Context. Di bawah ini adalah ekstensi pembantu saya untuk Contextdan Fragment.

Memeriksa Koneksi 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)
        }
    }
}

Ekstensi lainnya

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

periksa apakah Internet tersedia

@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

konektivitasManager.getActiveNetwork () tidak ditemukan di Android M di bawah ini (API 28). networkInfo.getState () sudah usang di atas Android L.

Jadi, jawaban terakhir adalah:

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
Anda mengatakan getActiveNetwork () tidak ditemukan di Android di bawah M, tetapi kode Anda menggunakannya di Lollipop!?
3c71

2

Banyak jawaban yang masih menggunakan getNetworkType di bawah 23 yang sudah usang; gunakan kode di bawah ini untuk memeriksa apakah perangkat memiliki koneksi internet.

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;
}

..

Dan, jangan lupa untuk menambahkan baris ini di Manifest

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

1

Karena jawaban yang diposting hanya memungkinkan Anda untuk menanyakan jaringan yang aktif, berikut ini cara mendapatkan NetworkInfountuk jaringan apa pun, tidak hanya yang aktif (misalnya jaringan Wifi) (maaf, kode Kotlin di depan)

(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
}

Ini membutuhkan API 21 atau lebih tinggi dan izinnya android.permission.ACCESS_NETWORK_STATE


1
currentNetwork.getType () dan ConnectivityManager.TYPE_WIFI keduanya tidak digunakan lagi di API 28.
Abushawish

@Abushawish Apa solusi yang disarankan untuk API 28?
tmm1

Penggantian sekarangcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

1

NetManager yang dapat Anda gunakan untuk memeriksa koneksi internet di Android dengan Kotlin

Jika Anda menggunakan 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) }
    }
}

Jika Anda menggunakan 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.agnosticdev.com/content/how-detect-network-connectivity-android

silakan ikuti tutorial ini. Ini akan membantu siapa pun yang mencari jawaban.

perhatikan networkInfo telah ditinggalkan maka ganti isNetworkReacheable () dengan @vidha jawaban di bawah ini lewat getApplicationContext () sebagai parameter

  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

Ini bekerja untuk saya di Kotlin. Banyak API tidak digunakan lagi di kelas Network Manager sehingga jawaban di bawah ini mencakup semua dukungan 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
}

Anda juga akan menambahkan di bawah ini

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

0

Kode di bawah ini berfungsi di semua API. (Kotlin)

Namun, getActiveNetworkInfo () tidak digunakan lagi di API 29 dan berfungsi di semua API, jadi kita bisa menggunakannya di semua Api di bawah 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

Sesuatu seperti ini:

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;
}

Dan di badan program utama:

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

Ini akan bekerja di Android 10 juga. Ini akan mengembalikan true jika terhubung ke internet lain kembali 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
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.