ฉันจะดูว่า Wi-Fi เชื่อมต่อกับ Android ได้อย่างไร


237

ฉันไม่ต้องการให้ผู้ใช้ของฉันลองดาวน์โหลดอะไรบางอย่างเว้นแต่พวกเขาเชื่อมต่อ Wi-Fi อย่างไรก็ตามฉันสามารถบอกได้ว่าเปิดใช้งาน Wi-Fi ได้หรือไม่ แต่พวกเขายังคงสามารถเชื่อมต่อ 3G ได้

android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
    return false;
}

อย่างไรก็ตามรัฐไม่ใช่สิ่งที่ฉันคาดหวัง แม้ว่าการเชื่อมต่อ Wi-Fi จะได้รับOBTAINING_IPADDRตามสถานะ

คำตอบ:


463

คุณควรใช้ ConnectivityManager เพื่อรับสถานะของอแด็ปเตอร์ Wi-Fi จากนั้นคุณสามารถตรวจสอบว่ามีการเชื่อมต่อหรือใช้ได้แม้

ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

if (mWifi.isConnected()) {
    // Do whatever
}

หมายเหตุ:ควรสังเกต (สำหรับเราที่ n00bies ที่นี่) ที่คุณต้องเพิ่ม

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

เพื่อคุณ

AndroidManifest.xmlเพื่อให้ทำงานได้

NOTE2 : public NetworkInfo getNetworkInfo (int networkType)เลิกใช้แล้ว:

วิธีนี้เลิกใช้แล้วในระดับ API 23 วิธีนี้ไม่รองรับเครือข่ายที่เชื่อมต่อหลายประเภทที่เหมือนกัน ใช้ getAllNetworks () และ getNetworkInfo (android.net.Network) แทน

NOTE3 : public static final int TYPE_WIFIเลิกใช้แล้ว:

ค่าคงนี้ถูกเลิกใช้ในระดับ API 28 แอปพลิเคชันควรใช้ NetworkCapabilities.hasTransport (int) หรือ requestNetwork (NetworkRequest, NetworkCallback) เพื่อขอเครือข่ายที่เหมาะสม สำหรับการขนส่งที่รองรับ


72
ควรสังเกต (สำหรับเราไม่มีเสียงรบกวนที่นี่) ที่คุณต้องเพิ่มลง android.permission.ACCESS_NETWORK_STATEใน AndroidManifest.xml เพื่อให้ทำงานได้
mgalgs

10
ใน Android รุ่นล่าสุดคุณต้องตรวจสอบ NULL ใน mWiFi ... รหัสของคุณที่นี่อาจทำให้เกิดข้อผิดพลาดของตัวชี้โมฆะ ดูdeveloper.android.com/training/basics/network-ops/managing.htmlและโดยเฉพาะอย่างยิ่ง "เมธอด getActiveNetworkInfo () จะส่งคืน NetworkInfo ... "
eb80

1
มันทำงานให้ฉันด้วย interface Ethernet เช่นกัน ฉันเพิ่งเปลี่ยนเป็นConnectivityManager.TYPE_ETHERNET
MBH

3
วิธี NetworkInfo.isConnected () ตอนนี้ depreceated ใน API-23 ฉันกำลังโพสต์โซลูชันด้านล่าง
ปฏิวัติ

1
NetworkInfo.getType ()และConnectivityManager.TYPE_WIFIตอนนี้เลิกใช้แล้วใน API 28 เพื่อหลีกเลี่ยงการเตือนขู่เข็ญคุณควรใช้สิ่งที่ต้องการconnectivityManager.getNetworkCapabilities(network).hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
Vadik

75

ตั้งแต่วิธีการNetworkInfo.isConnected ()คือตอนนี้เลิกใช้ในAPI-23นี่คือวิธีการที่ตรวจพบว่าอะแดปเตอร์ Wi-Fi และเชื่อมต่อไปยังจุดเชื่อมต่อโดยใช้ WifiManager แทน:

private boolean checkWifiOnAndConnected() {
    WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON

        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();

        if( wifiInfo.getNetworkId() == -1 ){
            return false; // Not connected to an access point
        }
        return true; // Connected to an access point
    }
    else {
        return false; // Wi-Fi adapter is OFF
    }
}

4
เป็นมูลค่าการกล่าวขวัญว่า wifiInfo สามารถเป็นโมฆะดังนั้นฉันคิดว่าคุณควรตรวจสอบโมฆะก่อนรับรหัสเครือข่าย
Nonos

2
NetworkInfo.isConnected()ฉันไม่เห็นด้วย
EricRobertBrewer

อย่าลืมเพิ่มสิทธิ์:android.permission.ACCESS_WIFI_STATE
Ton Snoei

1
งานนี้จะไม่ได้อยู่ใน Android Q ไม่ได้รับอนุญาตสถานที่และโหมดตำแหน่งเปิดดูissuetracker.google.com/issues/136021574
Konsumierer

@EricRobertBrewer แสดงความคิดเห็นไม่ถึงวันที่ ตอนนี้เป็น API ที่เลิกใช้แล้ว 29+
nuKs

35

ฉันแค่ใช้สิ่งต่อไปนี้:

SupplicantState supState; 
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();

ซึ่งจะคืนค่าสถานะใดสถานะหนึ่งในเวลาที่คุณเรียกใช้ getSupplicantState ();

สมาคม - สมาคมเสร็จสมบูรณ์

เชื่อมโยง - พยายามเชื่อมโยงกับจุดเชื่อมต่อ

เสร็จสิ้น - การรับรองความถูกต้องทั้งหมดเสร็จสมบูรณ์

DISCONNECTED - สถานะนี้ระบุว่าไคลเอ็นต์ไม่ได้เชื่อมโยง แต่มีแนวโน้มที่จะเริ่มมองหาจุดเชื่อมต่อ

DORMANT - สถานะที่เพิ่ม Android ที่รายงานเมื่อลูกค้าออกคำสั่ง DISCONNECT อย่างชัดเจน

FOUR_WAY_HANDSHAKE - WPA 4-Key Handshake กำลังดำเนินการ

GROUP_HANDSHAKE - กำลังดำเนินการจับมือคีย์กลุ่ม WPA

ไม่ใช้งาน - สถานะไม่ใช้งาน

INVALID - สถานะหลอกที่ปกติไม่ควรเห็น

การสแกน - สแกนหาเครือข่าย

UNINITIALIZED - ไม่มีการเชื่อมต่อ


สวัสดี Donal ฉันใช้วิธีเดียวกันเพื่อดูว่าอุปกรณ์ของเราเชื่อมต่อกับ wifi หรือไม่ แต่ฉันต้องทราบชื่อแอปที่ใช้ WiFi อยู่ในขณะนี้
AbhishekB

@AbhishekB ขอโทษด้วย แต่ฉันไม่มีประสบการณ์ลองดูที่แอพตรวจสอบ Wi-Fi บางตัวดูว่ามีโอเพนซอร์สอยู่หรือไม่ซึ่งคุณสามารถตรวจสอบรหัสได้
Donal Rafferty

ฉันสงสัยวิธีนี้เพราะผู้ร้องขอใช้เฉพาะเมื่อ WPA (หรือ WPA บางรูปแบบ) ใช้แล้ว d: หากผู้ใช้เชื่อมต่อกับ AP ที่ไม่มีการรับรองความถูกต้องหรือ WEP ดังนั้นผู้ร้องขอจะไม่เกี่ยวข้อง
Tom

2
มันยังปรากฏเป็น "เสร็จสิ้น" แม้ว่าฉันจะไม่ได้อยู่ใน wifi
Evan Parsons

1
มีความตั้งใจในการออกอากาศระบบสำหรับรัฐดังกล่าวข้างต้น? @DonalRafferty
Rohit Singh เมื่อ

19

ฉันใช้สิ่งนี้ในแอพของฉันเพื่อตรวจสอบว่าเครือข่ายที่ใช้งานอยู่เป็น Wi-Fi หรือไม่:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{

    // Do your work here

}

นี่เป็นคำตอบที่ดีที่สุดเพราะทำให้แน่ใจว่าactiveเครือข่าย (เครือข่ายที่จะใช้ในการดาวน์โหลด) คือ WiFi
Gavriel

1
นอกจากนี้ยังเป็นคำตอบที่ดีที่สุดในขณะนี้ที่NetworkInfo#isConnectedเลิกใช้แล้ว
Tash Pemhiwa

คำตอบที่ดีที่สุดสำหรับปีนี้อย่างแน่นอน (2017)
Daniel Nugent

18

ฉันได้ดูคำถามสองสามข้อเช่นนี้และเกิดขึ้นกับสิ่งนี้:

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isConnected()){
    // If Wi-Fi connected
}

if (mobile.isConnected()) {
    // If Internet connected
}

ฉันใช้ถ้าสำหรับการตรวจสอบใบอนุญาตของฉันใน Root Toolbox PRO และดูเหมือนว่าจะใช้งานได้ดี


8
ดูดี แต่ฉันไม่แน่ใจว่าทำไมคุณถึงได้รับการอ้างอิงที่สองถึง ConnectivityManager ในตัวอย่างนี้ connManager และ connManager1 มีทั้ง Object เดียวกัน
Nathan Schwermann

1
TYPE_MOBLIE หมายถึง 3gnet หรือ gprs net หรือไม่
herbertD

1
TYPE_MOBILE หมายถึงข้อมูลใด ๆ ที่ใช้บริการของคุณ - 2G (GPRS ... ), 3G (HSDPA ... ) หรือ 4G (LTE ... )
Eugen Pechanec

1
คุณสามารถเพิ่มTYPE_ETHERNETซึ่งทำงานได้ดีเมื่อเชื่อมต่อ android กับอีเธอร์เน็ต
MBH

1
เป็นสิ่งสำคัญที่ควรคำนึงถึงว่าgetNetworkInfo()จะส่งคืน null หากไม่มีเครือข่าย ดังนั้นหากอุปกรณ์ไม่มีการเชื่อมต่อมือถือนี่จะทำให้เกิดข้อผิดพลาด ในกรณีส่วนใหญ่ TYPE_ETHERNET จะทำให้เป็นโมฆะในกรณีนี้เนื่องจากอุปกรณ์ส่วนใหญ่จะไม่มีการเชื่อมต่ออีเธอร์เน็ต
Knossos

7

ในขณะที่คำตอบของ Jasonถูกต้องในปัจจุบัน getNetWorkInfo (int) เป็นวิธีที่เลิกใช้แล้ว ดังนั้นฟังก์ชั่นถัดไปจะเป็นทางเลือกที่ดี:

public static boolean isWifiAvailable (Context context)
{
    boolean br = false;
    ConnectivityManager cm = null;
    NetworkInfo ni = null;

    cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    ni = cm.getActiveNetworkInfo();
    br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));

    return br;
}

3

การใช้งานWifiManagerคุณสามารถทำได้:

WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}

เมธอดgetNeworkIdส่งคืน -1 เฉพาะเมื่อไม่ได้เชื่อมต่อกับเครือข่าย


WIFI_STATE_DISABLED ค่าคงที่: 1 (0x00000001) WIFI_STATE_DISABLING คงราคา: 0 (0x00000000) WIFI_STATE_ENABLED ค่าคงที่: 3 (0x00000003) WIFI_STATE_ENABLING ค่าคงที่: 2 (0x00000002) WIFI_STATE_UNKNOWN ค่าคงที่: 4 (0x00000004)
ลู Morda


งานนี้จะไม่ได้อยู่ใน Android Q ไม่ได้รับอนุญาตสถานที่และโหมดตำแหน่งเปิดดูissuetracker.google.com/issues/136021574
Konsumierer

3
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
                  ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
                    ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
    Toast.makeText(
        getApplicationContext(),
        "Please make sure, your network connection is ON ",
        Toast.LENGTH_LONG).show();
}
else {
    // Put your function() to go further;
}

1
มันจะเป็นการดีกว่าที่จะเพิ่มคำอธิบายมากกว่าแค่โค้ด
EdChum

2
ฉันจะใช้isConnected ()เอกสารพูดว่า: boolean isConnectedOrConnecting ()ระบุว่ามีการเชื่อมต่อเครือข่ายอยู่หรืออยู่ในกระบวนการสร้าง สิ่งนี้เป็นสิ่งที่ดีสำหรับแอปพลิเคชันที่ต้องทำสิ่งใด ๆ ที่เกี่ยวข้องกับเครือข่ายอื่นนอกเหนือจากอ่านหรือเขียนข้อมูล สำหรับสายหลังisConnected()แทนซึ่งรับประกันได้ว่าเครือข่ายสามารถใช้งานได้อย่างสมบูรณ์
18446744073709551615

3

รหัสต่อไปนี้ (ใน Kotlin) ทำงานได้จาก API 21 จนถึงรุ่น API ปัจจุบันอย่างน้อย (API 29) ฟังก์ชัน getWifiState () ส่งคืนหนึ่งใน 3 ค่าที่เป็นไปได้สำหรับสถานะเครือข่าย WiFi: ปิดใช้งาน EnabledNotConnected และเชื่อมต่อที่กำหนดไว้ในคลาส enum สิ่งนี้ช่วยให้การตัดสินใจที่ละเอียดยิ่งขึ้นเช่นแจ้งผู้ใช้เพื่อเปิดใช้งาน WiFi หรือหากเปิดใช้งานแล้วเพื่อเชื่อมต่อกับหนึ่งในเครือข่ายที่มีอยู่ แต่ถ้าสิ่งที่จำเป็นทั้งหมดคือบูลีนที่ระบุว่าอินเทอร์เฟซ WiFi เชื่อมต่อกับเครือข่ายแล้วฟังก์ชั่นอื่น ๆ ก็คือ มันใช้ก่อนหน้านี้และเปรียบเทียบผลลัพธ์กับการเชื่อมต่อ

มันเป็นแรงบันดาลใจในคำตอบก่อนหน้านี้บางส่วน แต่พยายามที่จะแก้ปัญหาที่เกิดขึ้นจากวิวัฒนาการของ Android API หรือความพร้อมใช้งานที่เพิ่มขึ้นอย่างช้าๆของ IP V6 เคล็ดลับคือการใช้:

wifiManager.connectionInfo.bssid != null 

แทน:

  1. getIpAddress () == 0 ที่ถูกต้องสำหรับ IP V4 หรือ
  2. getNetworkId () == -1 ตอนนี้ต้องได้รับการอนุญาตพิเศษอื่น ๆ (ที่ตั้ง)

อ้างอิงจากเอกสาร: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid มันจะส่งคืนค่า null หากไม่ได้เชื่อมต่อกับเครือข่าย และแม้ว่าเราจะไม่ได้รับอนุญาตให้รับค่าจริงมันก็ยังคงส่งคืนสิ่งอื่นที่ไม่ใช่ null หากเราเชื่อมต่อ

นอกจากนี้ยังมีสิ่งต่อไปนี้ในใจ:

ในการเผยแพร่ก่อน android.os.Build.VERSION_CODES # N วัตถุนี้ควรได้รับจาก Context # getApplicationContext () บริบทเท่านั้นและไม่ได้มาจากบริบทอื่นที่ได้รับเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำภายในกระบวนการเรียกใช้

ในรายการอย่าลืมเพิ่ม:

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

รหัสที่เสนอคือ:

class MyViewModel(application: Application) : AndroidViewModel(application) {

   // Get application context
    private val myAppContext: Context = getApplication<Application>().applicationContext

   // Define the different possible states for the WiFi Connection
    internal enum class WifiState {
        Disabled,               // WiFi is not enabled
        EnabledNotConnected,    // WiFi is enabled but we are not connected to any WiFi network
        Connected,              // Connected to a WiFi network
    }

    // Get the current state of the WiFi network
    private fun getWifiState() : WifiState {

        val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

        return if (wifiManager.isWifiEnabled) {
                    if (wifiManager.connectionInfo.bssid != null)
                        WifiState.Connected
                    else
                        WifiState.EnabledNotConnected
               } else {
                    WifiState.Disabled
               }
    }

    // Returns true if we are connected to a WiFi network
    private fun isWiFiConnected() : Boolean {
        return (getWifiState() == WifiState.Connected)
    }
}

3

NetworkInfoชั้นจะเลิกเป็นระดับ API ที่ 29 พร้อมกับวิธีการเข้าถึงที่เกี่ยวข้องเช่นและConnectivityManager#getNetworkInfo()ConnectivityManager#getActiveNetworkInfo()

เอกสารในขณะนี้แสดงให้เห็นคนที่จะใช้ConnectivityManager.NetworkCallbackAPI สำหรับการตรวจสอบการเรียกกลับ asynchronized หรือการใช้งานConnectivityManager#getNetworkCapabilitiesหรือConnectivityManager#getLinkPropertiesสำหรับการเข้าถึงข้อมูลให้ตรงกันของข้อมูลเครือข่าย

ผู้โทรควรใช้ ConnectivityManager.NetworkCallback API แทนเพื่อเรียนรู้เกี่ยวกับการเปลี่ยนแปลงการเชื่อมต่อหรือเปลี่ยนไปใช้ ConnectivityManager # getNetworkCapabilities หรือ ConnectivityManager # getLinkProperties เพื่อรับข้อมูลแบบซิงโครนัส


หากต้องการตรวจสอบว่าเชื่อมต่อ WiFi หรือไม่นี่คือรหัสที่ฉันใช้:

Kotlin:

val connMgr = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
connMgr?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    val network: Network = connMgr.activeNetwork ?: return false
    val capabilities = connMgr.getNetworkCapabilities(network)
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
    val networkInfo = connMgr.activeNetworkInfo ?: return false
    return networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI
}

Java:

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr == null) {
    return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Network network = connMgr.getActiveNetwork();
    if (network == null) return false;
    NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
    return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    return networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}

อย่าลืมเพิ่มสิทธิ์ACCESS_NETWORK_STATEให้กับไฟล์ Manifest ของคุณด้วย


2

ลองใช้วิธีนี้

public boolean isInternetConnected() {
    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    boolean ret = true;
    if (conMgr != null) {
        NetworkInfo i = conMgr.getActiveNetworkInfo();

        if (i != null) {
            if (!i.isConnected()) {
                ret = false;
            }

            if (!i.isAvailable()) {
                ret = false;
            }
        }

        if (i == null)
            ret = false;
    } else
        ret = false;
    return ret;
}

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


1
ฉันกำลังมองหาเฉพาะถ้าการเชื่อมต่อที่ใช้งานอยู่คือ wifi นอกจากนี้ไม่จำเป็นต้องทำการตรวจสอบ null ใน conMgr มันจะไม่เป็นโมฆะ
Nathan Schwermann

คุณช่วยตรวจสอบคำถามนี้ได้ไหม? :(
Skizo-ozᴉʞS

2

สิ่งนี้ใช้ได้กับฉัน:

    ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    // Mobile
    State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

    // Wi-Fi
    State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();

    // And then use it like this:

    if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
    }
    else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
    {
        Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled  :) ....",Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
    }

และเพิ่มการอนุญาตนี้:

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

2

คำตอบจำนวนมากใช้รหัสที่ไม่รองรับหรือรหัสที่มีในเวอร์ชัน higer API ตอนนี้ฉันใช้สิ่งนี้

ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(connectivityManager != null) {
            for (Network net : connectivityManager.getAllNetworks()) {
                NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
                if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
                    return true;
            }
        }
        return false;

1

นี่คือสิ่งที่ฉันใช้เป็นวิธีอรรถประโยชน์ในแอพของฉัน:

public static boolean isDeviceOnWifi(final Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi != null && mWifi.isConnectedOrConnecting();
}

เป็นการดีที่จะชี้ให้เห็นว่าวิธีการเชื่อมต่อหรือการเชื่อมต่อนั้นมีความสำคัญเมื่อคุณกำลังตรวจสอบเพื่อสร้างการเชื่อมต่อ วิธี IsConnected ไม่ทำงานสำหรับฉัน
วินเซนต์

1

ใน Android เวอร์ชันใหม่

private void getWifiInfo(Context context) {
    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    Network[] networks = connManager.getAllNetworks();

    if(networks == null || networks.length == 0)
        return;

    for( int i = 0; i < networks.length; i++) {
        Network ntk = networks[i];
        NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
        if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            if (connectionInfo != null) {
                // add some code here
            }
        }

    }
}

และเพิ่มคำเทศนาด้วย


connManager.getAllNetworks()ต้องใช้ API ระดับ 21
Jawand Singh เมื่อ


0

นี่เป็นวิธีที่ง่ายกว่า ดูคำถามซ้อนทับการตรวจสอบการเปิดใช้งาน Wi-Fi หรือไม่บน AndroidAndroid

PS อย่าลืมเพิ่มรหัสลงในไฟล์ manifest.xml เพื่ออนุญาต ดังแสดงด้านล่าง

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

0

ลอง

wifiManager.getConnectionInfo().getIpAddress()

สิ่งนี้จะคืนค่า 0 จนกว่าอุปกรณ์จะมีการเชื่อมต่อที่ใช้งานได้ (บนเครื่องของฉันคือ Samsung SM-T280, Android 5.1.1)


0

คุณสามารถเปิด WIFI ได้หากไม่ได้เปิดใช้งานดังต่อไปนี้ 1. ตรวจสอบสถานะ WIFI ตามที่ได้รับการตอบโดย @Jason Knight 2. หากไม่เปิดใช้งานให้เปิดใช้งานอย่าลืมเพิ่มสิทธิ์ WIFI ในไฟล์ Manifest

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

คลาส Java ของคุณควรเป็นเช่นนั้น

public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //check WIFI activation
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected() == false) {
        showWIFIDisabledAlertToUser();
    }
    else {
        Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
    }
}


private void showWIFIDisabledAlertToUser(){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
            .setCancelable(false)
            .setPositiveButton("Goto Settings Page To Enable WIFI",
                    new DialogInterface.OnClickListener(){
                        public void onClick(DialogInterface dialog, int id){
                            Intent callGPSSettingIntent = new Intent(
                                    Settings.ACTION_WIFI_SETTINGS);
                            startActivity(callGPSSettingIntent);
                        }
                    });
    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int id){
                    dialog.cancel();
                }
            });
    AlertDialog alert = alertDialogBuilder.create();
    alert.show();
}

}


0

เพิ่มสิ่งนี้สำหรับ JAVA:

public boolean CheckWifiConnection() {
        ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() != null
                && conMgr.getActiveNetworkInfo().isAvailable()
                && conMgr.getActiveNetworkInfo().isConnected()) {
            return true;
        } else {
            return false;
        }
    }

ในไฟล์รายการเพิ่มสิทธิ์ต่อไปนี้:

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

0

คำถามแบบเก่า แต่นี่คือสิ่งที่ฉันใช้ ต้องใช้นาที api ระดับ 21 ยังใช้ในการพิจารณาคัดค้าน Networkinfo apis

boolean isWifiConn = false;
    ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network network = connMgr.getActiveNetwork();
        if (network == null) return false;
        NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
        if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
            isWifiConn = true;
            Toast.makeText(context,"Wifi connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(context,"Wifi not connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
        }
    } else {
        for (Network network : connMgr.getAllNetworks()) {
            NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
                isWifiConn = true;
                Toast.makeText(context,"Wifi connected ",Toast.LENGTH_LONG).show();
                break;
            }else{
                Toast.makeText(context,"Wifi not connected ",Toast.LENGTH_LONG).show();
            }
        }
    }
    return isWifiConn;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.