ConnectivityManager getNetworkInfo (int) เลิกใช้แล้ว


144

การใช้compileSdkVersion 23แต่พยายามสนับสนุนไกลถึง 9

getNetworkInfo(int)เลิกใช้แล้วใน 23 ข้อเสนอแนะคือการใช้getAllNetworks()และgetNetworkInfo(Network)แทน อย่างไรก็ตามทั้งสองอย่างนี้ต้องการ API ขั้นต่ำ 21

มีคลาสที่เราสามารถใช้ในแพ็คเกจการสนับสนุนที่สามารถช่วยเหลือสิ่งนี้ได้หรือไม่?

ฉันรู้ว่ามีการเสนอวิธีแก้ไขปัญหามาก่อนอย่างไรก็ตามความท้าทายของข้อกำหนดขั้นต่ำ API ของฉันที่ 9 ก่อให้เกิดปัญหา


คุณสามารถตรวจสอบ
บิวด์

1
สิ่งนี้จะยังคงเป็นคำเตือนที่เลิกใช้แล้วหรือไม่?
kyleED

โปรดเช็คเอาต์คลาส ConnectivityObserverของฉันซึ่งสรุปวิธีการ API ด้านล่างและเหนือ Android Nougat
JJD

คำตอบ:


166

คุณสามารถใช้ได้:

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
}

หรือในกรณีสวิตช์

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 - ใช่ Broadcast Receiver ไม่จำเป็นในกรณีนี้ getActiveNetworkInfo () สามารถวางในวิธีการของตัวเองโดยมีการอ้างอิงบริบท
ขนมปังชีส

1
@TheIT - ใช่เอกสารระบุว่า "คุณควรตรวจสอบ isConnected () ก่อนเริ่มการรับส่งข้อมูลเครือข่าย" โซลูชันนี้ไม่เริ่มต้นทราฟฟิกและจัดเตรียมโซลูชันสำหรับการเรียก getNetworkInfo () ที่คัดค้านเท่านั้น
ขนมปังชีส

7
ในฐานะของ Android 9, SDK 28 ตอนนี้เลิกใช้แล้ว
Zbarcea Christian

32
activeNetwork.getType()เลิกใช้แล้วและConnectivityManager.TYPE_WIFIเลิกใช้แล้ว
Godwin

7
ตอนนี้การเปลี่ยนcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

63

สำหรับเดือนตุลาคม 2561 คำตอบที่ยอมรับจะถูกคัดค้าน

getType()และพิมพ์เองตอนนี้เลิกใช้แล้วในระดับ API 28 จาก Javadoc:

ผู้โทรควรเปลี่ยนเป็นการตรวจสอบ NetworkCapabilities # hasTransport แทนหนึ่งใน NetworkCapabilities # TRANSPORT * ค่าคงที่

ในการใช้งานNetworkCapabilitiesคุณจะต้องส่งNetworkตัวอย่างไปยังgetNetworkCapabilities()วิธีการ ในการรับอินสแตนซ์นั้นคุณต้องโทรหาgetActiveNetwork()ซึ่งเพิ่มใน API ระดับ 23

ตอนนี้ฉันเชื่อว่าวิธีที่ถูกต้องในการตรวจสอบอย่างปลอดภัยว่าคุณเชื่อมต่อกับ Wi-Fi หรือเครือข่ายเซลลูลาร์คือ:

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

นอกจากนี้คุณยังสามารถตรวจสอบประเภทอื่น ๆTRANSPORTซึ่งคุณสามารถหาได้ที่นี่

หมายเหตุสำคัญ:หากคุณเชื่อมต่อกับ Wi-Fi และ VPN สถานะปัจจุบันของคุณอาจเป็นTRANSPORT_VPNเช่นนั้นดังนั้นคุณอาจต้องการตรวจสอบด้วย

อย่าลืมเพิ่มสิทธิ์ต่อไปนี้ในไฟล์ AndroidManifest ของคุณ:

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

hasTransport (NetworkCapabilities.TRANSPORT_WIFI) เทียบเท่ากับ ni.isConnected () && (ni.getType () == ConnnectivityManager.TYPE_WIFI หรือไม่ ฉันหมายถึงฟังก์ชั่น hasTransport () ตรวจสอบว่าอุปกรณ์เชื่อมต่อหรือพยายามเชื่อมต่อหรือไม่?
บิสกิต

อีกครั้งที่NetworkInfoมีการคิดค่าเสื่อมราคาคุณไม่สามารถใช้อีกต่อไปNetWorkInfoดังนั้นสิ่งนี้จะให้ทางเลือกอื่นได้อย่างไร
Prescott Chartier

@PrescottChartier ข้อมูลโค้ดนี้เข้าถึงเฉพาะ NetworkInfo บน SDK <23 อุปกรณ์
Tom

59

อัปเดตในเดือนกุมภาพันธ์ 2020:

คำตอบที่ได้รับการยอมรับจะเลิกอีกครั้งในแต่วิธีแทนที่ทำงานเฉพาะใน28 (Android P) 23 (Android M)เพื่อรองรับอุปกรณ์รุ่นเก่าฉันได้เขียนฟังก์ชันตัวช่วย

วิธีใช้:

int type = getConnectionType(getApplicationContext());

มันกลับintมาคุณสามารถเปลี่ยนเป็นenumรหัสของคุณ:

0: ไม่มีอินเทอร์เน็ต (อาจเป็นโหมดเครื่องบินหรืออยู่ระหว่างการเข้าร่วม Wi-Fi)

1: มือถือ (ข้อมูลมือถือ, 3G / 4G / LTE)

2: Wi-Fi

3: VPN

คุณสามารถคัดลอก Kotlin หรือรุ่น Java ของฟังก์ชันตัวช่วย

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

2
เนื่องจากคุณมีผลลัพธ์ที่เป็นไปได้ 2 ข้อจึงควรใช้บูลีนแทนการส่งคืนจำนวนเต็ม ...
Christian

3
@Christian ตามที่อธิบายไว้ในส่วนสีเหลือง, ฟังก์ชั่นนี้ส่งกลับผู้ช่วย 3 รัฐเป็นไปได้: No Internet, และCellular Wi-Fiหากคุณไม่สนใจประเภทการเชื่อมต่ออย่าลังเลที่จะปรับเปลี่ยนรหัสให้เหมาะกับแอปพลิเคชันของคุณ
user1032613

1
สิ่งที่เกี่ยวกับความคิดเห็นในโซลูชันด้านบน "ถ้าคุณเชื่อมต่อกับ Wi-Fi และ VPN สถานะปัจจุบันของคุณอาจเป็น TRANSPORT_VPN ดังนั้นคุณอาจต้องการตรวจสอบด้วย"
David

1
@Lukas คุณต้องระวังถ้าคุณใช้Booleanคลาส wrapper แทนที่จะbooleanเป็นแบบดั้งเดิม nullหากคำสั่งที่คุณจะต้องเพิ่มการตรวจสอบ นอกจากนี้จะเกิดอะไรขึ้นถ้าพรุ่งนี้มีการเปิดตัวโหมดการขนส่งใหม่ใน NetworkCapabilities ... ดังนั้นการใช้จำนวนเต็มสำหรับการแตกแขนงจะช่วยคุณได้
Shadow Droid

3
เหนื่อยกับวงจรการลดค่าคงที่นี้
Segun Wahaab

16

อัปเดตคำตอบแล้ว (19: 07: 2018):

วิธีนี้จะช่วยคุณตรวจสอบว่ามีการเชื่อมต่ออินเทอร์เน็ตหรือไม่

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

คำตอบเก่า:

สำหรับวิธีปฏิบัติที่ดีที่สุดในการนำโค้ดกลับมาใช้ใหม่คำตอบของ Bread 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;
}

รหัสสามารถวางในคลาส Util และสามารถใช้เพื่อตรวจสอบว่าโทรศัพท์เชื่อมต่อกับอินเทอร์เน็ตผ่าน Wifi หรืออินเทอร์เน็ตบนมือถือจากส่วนใด ๆ ของแอปพลิเคชันของคุณ


3
ฉันขอแนะนำให้ย้ายเครือข่ายที่ใช้งานอยู่นอกวง
shtolik

20
activeNetwork.isConnectedOrConnecting()เลิกใช้แล้วตอนนี้
MHSFisher

1
ฉันเปลี่ยน activeNetwork.isConnectedOrConinging () เป็น activeNetwork.isConnected
Murillo Comino

NetworkInfo เลิกใช้แล้ว จำเป็นต้องอัปเดตอีกครั้ง!
Scott Biggs

13

คำตอบที่ยอมรับถูกคัดค้านในรุ่น 28 ดังนั้นนี่คือคำตอบที่ฉันใช้ในโครงการของฉัน

ส่งคืนประเภทการเชื่อมต่อ false: ไม่มีการเชื่อมต่ออินเทอร์เน็ต จริง: ข้อมูลมือถือ || อินเตอร์เน็ตไร้สาย

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 () เลิกใช้แล้ว คุณสามารถใช้ activeNetwork.isConnected ();
Aman Verma

11

มีการอัปเดตคำตอบนี้ ณ เดือนมีนาคม 2563 ที่รองรับ API.15 ถึง API.29 คุณสามารถค้นหาคำตอบได้จากคำตอบเดิม

ตอบกุมภาพันธ์ 2562

วิธีตรวจสอบว่าคุณออนไลน์หรือไม่:

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

เพื่อรับประเภทการเชื่อมต่ออินเทอร์เน็ตก่อน / หลัง 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
            }
        }
    }
}

ทุกกรณีต้องได้รับอนุญาตในการเข้าถึงสถานะเครือข่าย

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

อัปเดตมีนาคม 2563

ตามที่NetworkInfoถูกปฏิเสธและเป็นของ API 29 จากตอนนี้เราต้องใช้ConnectivityManager.NetworkCallbackกับการเปลี่ยนแปลงสถานะเครือข่ายonAvailable()และการonLost()เรียกกลับ

การใช้งาน:

  • คุณสามารถใช้ไลบรารีนี้หรือใช้คลาสยูทิลิตี้ด้านล่างซึ่งเป็นส่วนหนึ่งของไลบรารีนี้โดยตรง

คุณสมบัติ

  • มันเป็นวงจรชีวิตที่ใส่ใจด้วยการนำLifecycleObserverไปใช้เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำโดยการล้างข้อมูลด้วยonDestroy()วิธีการ
  • รองรับจาก API 15 (Ice Cream Sandwich) ถึง API 29 (Android Q)
  • สำหรับ API ก่อนหน้า API 21 จะใช้บริบทBoradcastReceiverและNetworkInfoและใช้ConnectivityManager.NetworkCallbackสำหรับ API 21 ขึ้นไป
  • เมื่อทั้ง WiFi และเครือข่ายเซลลูลาร์เปิดอยู่ฟังการเชื่อมต่อจะไม่ขัดจังหวะเมื่อมีการตัดการเชื่อมต่อ WiFi ในขณะที่เปลี่ยนไปใช้เครือข่ายเซลลูลาร์
  • เมื่อเครือข่ายเซลลูลาร์เปิดอยู่ฟังการเชื่อมต่อจะไม่ขัดจังหวะเมื่อเชื่อมต่อ WiFi และเป็นเครือข่ายที่ใช้งานอยู่ (เนื่องจากเป็นเครือข่ายที่ต้องการ)
  • หากคุณกำลังจะใช้ห้องสมุดแล้วไม่จำเป็นต้องมีการอนุญาตนี้android.permission.ACCESS_NETWORK_STATE; แต่คุณต้องรวมไว้หากคุณจะใช้คลาสยูทิลิตี้

ความสามารถในการ

  • รับสถานะการเชื่อมต่อปัจจุบัน (ออนไลน์ / ออฟไลน์)
  • ตรวจสอบ / ฟังการเชื่อมต่ออินเทอร์เน็ตอย่างต่อเนื่องและเริ่มการโทรกลับเมื่ออุปกรณ์ออฟไลน์หรือออนไลน์
  • รับประเภทการเชื่อมต่ออินเทอร์เน็ตที่ใช้งานอยู่ (WiFi หรือ Cellular)
  • รับประเภทของเครือข่ายที่ใช้ได้ทั้งหมด (WiFi หรือ Cellular) >> รองรับเฉพาะกับ API 21+ เท่านั้น
  • รับจำนวนเครือข่ายที่มีทั้งหมด >> รองรับเฉพาะใน 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 โปรดตรวจสอบคำตอบที่อัปเดตหวังว่ามันจะช่วยได้
Zain

หากผู้ใช้เชื่อมต่อกับ Wifi และข้อมูลมือถือในเวลาเดียวกันและขาดการเชื่อมต่อในหนึ่งในนั้นonLostจะถูกเรียก onLostไม่ได้หมายความว่าอุปกรณ์ขาดการเชื่อมต่ออินเทอร์เน็ต แต่เครือข่ายขาดการเชื่อมต่อ
Gokhan Arik

@Gokhan Arik .. นีจับฉันกำลังทำงานกับมันแก้มัน
Zain

1
ตรวจสอบการสนทนานี้gist.github.com/PasanBhanu/730a32a9eeb180ec2950c172d54bb06a
Gokhan Arik

@GokhanArik ขอบคุณสำหรับความช่วยเหลือ .. ฉันเพียงแค่การปรับปรุงคำตอบของฉันและการใช้งาน API ขยาย plz ให้เราทราบหากคุณสังเกตเห็นข้อบกพร่องใด ๆ
Zain

4

เป็นการดีที่จะตรวจสอบว่าเครือข่ายของคุณเชื่อมต่อกับอินเทอร์เน็ตหรือไม่:

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

NetworkCapabilities.NET_CAPABILITY_VALIDATEDนอกจากนี้คุณยังอาจต้องการตรวจสอบ
JJD

3

รุ่น 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

ตามที่แนะนำ Bread Bread ให้ใช้ getActiveNetworkInfo ()

getActiveNetworkInfo

เพิ่มในระดับ API 1

NetworkInfo getActiveNetworkInfo ()

ส่งคืนรายละเอียดเกี่ยวกับเครือข่ายข้อมูลเริ่มต้นที่ใช้งานอยู่ในปัจจุบัน เมื่อเชื่อมต่อเครือข่ายนี้เป็นเส้นทางเริ่มต้นสำหรับการเชื่อมต่อขาออก คุณควรตรวจสอบ isConnected () ก่อนเริ่มการรับส่งข้อมูลเครือข่าย สิ่งนี้อาจส่งคืนค่าว่างเมื่อไม่มีเครือข่ายเริ่มต้น วิธีการนี้ต้องการให้ผู้โทรถือสิทธิ์ ACCESS_NETWORK_STATE ส่งคืน NetworkInfo วัตถุ NetworkInfo สำหรับเครือข่ายเริ่มต้นปัจจุบันหรือ null หากไม่มีเครือข่ายเริ่มต้นที่ใช้งานอยู่ในปัจจุบัน

ข้อมูลอ้างอิง: 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;
}

ตอนนี้เรียกวิธีการเพื่อให้ลองใช้อย่างปลอดภัย

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

และอย่าลืมเพิ่ม:

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

ขอบคุณมันมีประโยชน์ เมื่อเราตรวจสอบสถานะเครือข่ายและถ้า wifi และข้อมูลทั้งคู่
หลุด

อย่างไรก็ตามวิธีนี้ใช้ไม่ได้หากฉันต้องการตรวจสอบว่ามีเครือข่ายประเภทใดประเภทหนึ่งระบุจำนวนเครือข่ายทั้งหมดที่มีอยู่หรือไม่getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).isAvailable
m0skit0

3
getState () เลิกใช้แล้ว!
Diego Venâncio

คำแนะนำที่เลิกใช้หลายประการ!
Scott Biggs

2

เพื่อที่จะอยู่ในด้านความปลอดภัยฉันจะแนะนำให้ใช้วิธีการ

NetworkInfo.isConnected ()

วิธีการทั้งหมดอาจเป็นดังนี้:

/**
 * 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()เลิกใช้แล้วและConnectivityManager.TYPE_WIFI เลิกใช้แล้ว
Godwin

2

นี่คือวิธีที่ฉันตรวจสอบว่าเครือข่ายปัจจุบันใช้เซลลูล่าร์หรือไม่ใน Android เวอร์ชันล่าสุด:

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

(เกือบ) คำตอบทั้งหมดถูกคัดค้านใน Android P ดังนั้นนี่คือC#โซลูชัน ( ซึ่งง่ายต่อการติดตามสำหรับนักพัฒนา 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);
}   

กุญแจสำคัญที่นี่คือ Android.Net.TransportType


เอาเป็นว่า Aaaannnndddd ทุกอย่างในที่นี้จะถูกยกเลิก!
เพรสคอตต์ชา

@PrescottChartier เวอร์ชันใด?
Mehdi Dehghani

2

เราอาจต้องตรวจสอบการเชื่อมต่ออินเทอร์เน็ตมากกว่าหนึ่งครั้ง Contextดังนั้นมันจะง่ายขึ้นสำหรับเราถ้าเราเขียนบล็อกรหัสในวิธีการขยายตัวของ ด้านล่างนี้เป็นส่วนขยายผู้ช่วยของฉันและContextFragment

ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต

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

ส่วนขยายอื่น ๆ

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

ตรวจสอบว่ามีอินเทอร์เน็ตหรือไม่

@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 () ไม่พบด้านล่าง android M (API 28) networkInfo.getState () ถูกคัดค้านเหนือ android 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
คุณบอกว่า getActiveNetwork () ไม่พบใน Android ที่ต่ำกว่า M แต่รหัสของคุณใช้กับ Lollipop!?
3c71

2

คำตอบมากมายยังคงใช้getNetworkTypeต่ำกว่า 23 ซึ่งเลิกใช้แล้ว ใช้รหัสด้านล่างเพื่อตรวจสอบว่าอุปกรณ์มีการเชื่อมต่ออินเทอร์เน็ต

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

..

และอย่าลืมเพิ่มบรรทัดนี้ใน Manifest

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

1

เนื่องจากคำตอบที่โพสต์ช่วยให้คุณสามารถค้นหาเครือข่ายที่ใช้งานได้ต่อไปนี้เป็นวิธีรับNetworkInfoเครือข่ายใด ๆ ไม่เพียง แต่เครือข่ายที่ใช้งานอยู่ (เช่นเครือข่าย Wifi) (ขออภัยรหัส Kotlin ข้างหน้า)

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

ต้องใช้ API 21 ขึ้นไปและต้องได้รับอนุญาต android.permission.ACCESS_NETWORK_STATE


1
currentNetwork.getType () และ ConnectivityManager.TYPE_WIFI ทั้งคู่เลิกใช้ใน API 28
Abushawish

@Abushawish ทางออกที่แนะนำสำหรับ API 28 คืออะไร
tmm1

ตอนนี้การเปลี่ยนcm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
tmm1

1

NetManagerที่คุณสามารถใช้เพื่อตรวจสอบการเชื่อมต่ออินเทอร์เน็ตบน Android ด้วย Kotlin

หากคุณใช้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) }
    }
}

หากคุณใช้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

โปรดทำตามบทช่วยสอนนี้ซึ่งจะช่วยให้ทุกคนมองหาคำตอบ

note networkInfo เลิกใช้แล้วดังนั้นแทนที่ isNetworkReacheable () ด้วยคำตอบ @vidha ด้านล่างผ่านการส่ง getApplicationContext () เป็นพารามิเตอร์

  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

สิ่งนี้ใช้ได้กับฉันใน Kotlin API จำนวนมากถูกคัดค้านในคลาส Network Manager ดังนั้นคำตอบด้านล่างครอบคลุมการสนับสนุน 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
}

คุณจะเพิ่มด้านล่าง

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

0

รหัสด้านล่างใช้งานได้กับ API ทั้งหมด (Kotlin)

อย่างไรก็ตาม getActiveNetworkInfo () เลิกใช้แล้วใน API 29 เท่านั้นและทำงานได้กับ API ทั้งหมดดังนั้นเราจึงสามารถใช้งานได้ใน Api ด้านล่าง 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

บางสิ่งเช่นนี้

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

และในเนื้อหาโปรแกรมหลัก:

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

มันจะทำงานบน Android 10 เช่นกัน มันจะกลับมาจริงถ้าเชื่อมต่อกับอินเทอร์เน็ตอื่นกลับเท็จ

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
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.