Làm cách nào để xem Wi-Fi có được kết nối trên Android không?


237

Tôi không muốn người dùng của mình thậm chí thử tải xuống một cái gì đó trừ khi họ có kết nối Wi-Fi. Tuy nhiên, tôi dường như chỉ có thể biết liệu Wi-Fi có được bật hay không, nhưng họ vẫn có thể có kết nối 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;
}

Tuy nhiên, nhà nước không như tôi mong đợi. Mặc dù Wi-Fi được kết nối, tôi vẫn nhận được OBTAINING_IPADDRtrạng thái.

Câu trả lời:


463

Bạn sẽ có thể sử dụng ConnectivityManager để có trạng thái của bộ điều hợp Wi-Fi. Từ đó bạn có thể kiểm tra nếu nó được kết nối hoặc thậm chí có sẵn .

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

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

LƯU Ý: Cần lưu ý (đối với chúng tôi n00 sở thích ở đây) mà bạn cần thêm

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

cho bạn

AndroidManifest.xml để làm việc này.

CHÚ THÍCH 2 : public NetworkInfo getNetworkInfo (int networkType)hiện không được chấp nhận:

Phương pháp này không được chấp nhận ở cấp độ API 23. Phương pháp này không hỗ trợ nhiều mạng được kết nối cùng loại. Thay vào đó, hãy sử dụng getAllNetworks () và getNetworkInfo (android.net.Network).

CHÚ THÍCH 3 : public static final int TYPE_WIFIhiện không được chấp nhận:

Hằng số này không được chấp nhận ở cấp độ API 28. Thay vào đó, các ứng dụng nên sử dụng NetworkCapabilities.hasTransport (int) hoặc requestNetwork (NetworkRequest, NetworkCallback) để yêu cầu một mạng phù hợp. cho vận chuyển được hỗ trợ.


72
Cần lưu ý (đối với chúng tôi là những người không thích ở đây) rằng bạn cần thêm android.permission.ACCESS_NETWORK_STATEvào AndroidManifest.xml để làm việc này.
mgasms

10
Trong các phiên bản Android gần đây, bạn cần kiểm tra NULL trong mWiFi ... mã của bạn ở đây có thể gây ra lỗi con trỏ null. Xem developer.android.com/training/basics/network-ops/managing.html và đặc biệt là "Phương thức getActiveNetworkInfo () trả về NetworkInfo ..."
eb80

1
Nó cũng làm việc với tôi với giao diện Ethernet. Tôi vừa đổi thành ConnectivityManager.TYPE_ETHERNET
MBH

3
Phương thức NetworkInfo.isConnected () hiện không được dùng nữa trong API-23. Tôi đang đăng một giải pháp dưới đây.
cách mạng

1
NetworkInfo.getType ()ConnectivityManager.TYPE_WIFI hiện không được dùng nữa trong API 28. Để tránh cảnh báo lint, bạn nên sử dụng một cái gì đó nhưconnectivityManager.getNetworkCapabilities(network).hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
Vadik

75

Vì phương thức NetworkInfo.isConnected () hiện không được dùng trong API-23 , nên đây là phương pháp phát hiện nếu bộ điều hợp Wi-Fi được bật và cũng được kết nối với một điểm truy cập bằng 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
Điều đáng nói là wifiInfo có thể là null vì vậy tôi nghĩ bạn nên kiểm tra null trước khi nhận id mạng
Nonos 7/07/2016

2
NetworkInfo.isConnected()không có vẻ phản đối với tôi.
EricRobertBrewer

Đừng quên thêm quyền:android.permission.ACCESS_WIFI_STATE
Ton Snoei

1
Điều này sẽ không còn hoạt động trong Android Q nếu không có sự cho phép của vị trí và chế độ vị trí được bật, hãy xem suetracker.google.com/issues/136021574 .
Konsumierer

@EricRobertBrewer bình luận không còn cập nhật. bây giờ, API 29+ không dùng nữa.
nuKs

35

Tôi chỉ đơn giản là sử dụng như sau:

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

Sẽ trả về một trong những trạng thái này tại thời điểm bạn gọi getSupplicantState ();

HIỆP HỘI - Hiệp hội hoàn thành.

ASSOCIATING - Cố gắng liên kết với một điểm truy cập.

HOÀN THÀNH - Tất cả xác thực đã hoàn thành.

KHÁM PHÁ - Trạng thái này cho biết rằng máy khách không được liên kết, nhưng có khả năng bắt đầu tìm kiếm một điểm truy cập.

DORMANT - Trạng thái được thêm vào Android được báo cáo khi máy khách đưa ra lệnh DISCONNECT rõ ràng.

FOUR_WAY_HANDSHAKE - Bắt tay với khóa 4 chiều WPA.

GROUP_HANDSHAKE - Tiến trình bắt tay khóa nhóm WPA.

Không hoạt động - Trạng thái không hoạt động.

INVALID - Một trạng thái giả thường không bao giờ được nhìn thấy.

KẾ HOẠCH - Quét mạng.

UNINITIALIZED - Không có kết nối.


xin chào Donal. Tôi đã sử dụng cùng một cách để biết thiết bị của chúng tôi có được kết nối với wifi hay không. Ngoài ra, tôi cần biết tên Ứng dụng hiện đang sử dụng WIFI. Làm thế nào mà b có thể thực hiện được?
AbhishekB

@AbhishekB, xin lỗi nhưng tôi không có bất kỳ kinh nghiệm nào về điều đó, có lẽ hãy thử xem một số ứng dụng giám sát Wi-Fi, xem có nguồn mở nào để bạn có thể xem lại mã không.
Donal Rafferty

Tôi nghi ngờ về giải pháp này vì chất thay thế chỉ được sử dụng nếu WPA (hoặc một số biến thể của WPA) được sử dụng: nếu người dùng kết nối với AP không có xác thực hoặc WEP thì không có liên quan.
Tom

2
Nó vẫn hiển thị dưới dạng "HOÀN THÀNH" mặc dù tôi không có wifi
Evan Parsons

1
Có bất kỳ ý định phát sóng hệ thống cho các quốc gia nêu trên? @DonalRafferty
Rohit Singh

19

Tôi đang sử dụng điều này trong các ứng dụng của mình để kiểm tra xem mạng hoạt động có phải là Wi-Fi không:

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

    // Do your work here

}

Đây là câu trả lời tốt nhất vì nó đảm bảo rằng activemạng (mạng sẽ được sử dụng để tải xuống) là WiFi
Gavriel

1
Đó cũng là câu trả lời hay nhất hiện nay không NetworkInfo#isConnectedđược chấp nhận
Tash Pemhiwa

Chắc chắn là câu trả lời tốt nhất cho năm nay (2017).
Daniel Nugent

18

Tôi đã xem xét một vài câu hỏi như thế này và nghĩ ra điều này:

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
}

Tôi sử dụng nếu kiểm tra giấy phép của tôi trong Root Toolbox PRO, và nó có vẻ hoạt động rất tốt.


8
có vẻ tốt nhưng tôi không chắc tại sao bạn lại có được tài liệu tham khảo thứ hai về ConnectivityManager. Trong ví dụ này, ConnManager và ConnManager1 đều là cùng một đối tượng
Nathan Schwermann

1
TYPE_MOBLIE có nghĩa là 3gnet hoặc gprs net?
herbertD

1
TYPE_MOBILE có nghĩa là bất kỳ dữ liệu nào sử dụng nhà cung cấp dịch vụ của bạn - 2G (GPRS ...), 3G (HSDPA ...) hoặc 4G (LTE ...).
Eugen Pechanec

1
bạn có thể thêm TYPE_ETHERNET hoạt động tốt khi kết nối Android với Ethernet
MBH

1
Điều đáng ghi nhớ là điều đó getNetworkInfo()sẽ trả về null, nếu mạng không tồn tại. Vì vậy, nếu thiết bị không có kết nối di động, điều này sẽ gây ra lỗi. Trong hầu hết các trường hợp, TYPE_ETHERNET sẽ gây ra null trong trường hợp này, vì hầu hết các thiết bị sẽ không có kết nối Ethernet.
Knossos

7

Trong khi câu trả lời của Jason là chính xác, ngày nay getNetWorkInfo (int) là một phương pháp không dùng nữa. Vì vậy, chức năng tiếp theo sẽ là một lựa chọn tốt:

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

Sử dụng WifiManagerbạn có thể làm:

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

Phương thức getNeworkId chỉ trả về -1 khi nó không được kết nối với mạng;


WIFI_STATE_DISABLED Giá trị không đổi: 1 (0x00000001) WIFI_STATE_DISABLING liên tục Value: 0 (0x00000000) WIFI_STATE_ENABLED Giá trị không đổi: 3 (0x00000003) WIFI_STATE_ENABLING Giá trị không đổi: 2 (0x00000002) WIFI_STATE_UNKNOWN liên tục giá trị gia tăng: 4 (0x00000004)
Lou Morda


Điều này sẽ không còn hoạt động trong Android Q nếu không có sự cho phép của vị trí và chế độ vị trí được bật, hãy xem suetracker.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
sẽ tốt hơn để thêm một số lời giải thích thay vì chỉ mã.
EdChum

2
Tôi sẽ sử dụng isConnected () , các tài liệu nói: boolean isConnectedOrConnecting ()Cho biết liệu kết nối mạng có tồn tại hay đang trong quá trình thiết lập. Điều này tốt cho các ứng dụng cần làm bất cứ điều gì liên quan đến mạng ngoài việc đọc hoặc ghi dữ liệu. Đối với cái sau, hãy gọi isConnected()thay thế, điều này đảm bảo rằng mạng hoàn toàn có thể sử dụng được.
18446744073709551615

3

Đoạn mã sau (trong Kotlin) hoạt động từ API 21 cho đến ít nhất là phiên bản API hiện tại (API 29). Hàm getWifiState () trả về một trong 3 giá trị có thể cho trạng thái mạng WiFi: Vô hiệu hóa, EnablesNotConnected và Connected được xác định trong một lớp enum. Điều này cho phép đưa ra các quyết định chi tiết hơn như thông báo cho người dùng kích hoạt WiFi hoặc, nếu đã được bật, để kết nối với một trong các mạng có sẵn. Nhưng nếu tất cả những gì cần thiết là một boolean cho biết nếu giao diện WiFi được kết nối với mạng, thì chức năng khác làWifiConnected () sẽ cung cấp cho bạn điều đó. Nó sử dụng cái trước đó và so sánh kết quả với Connected.

Nó lấy cảm hứng từ một số câu trả lời trước nhưng cố gắng giải quyết các vấn đề do sự phát triển của API Android hoặc tính sẵn có của IP V6 tăng chậm. Bí quyết là sử dụng:

wifiManager.connectionInfo.bssid != null 

thay vì:

  1. getIpAddress () == 0 chỉ hợp lệ cho IP V4 hoặc
  2. getNetworkId () == -1 hiện cần một sự cho phép đặc biệt khác (Vị trí)

Theo tài liệu: https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid, nó sẽ trả về null nếu không được kết nối với mạng. Và ngay cả khi chúng tôi không có quyền nhận được giá trị thực, nó vẫn sẽ trả về một thứ khác ngoài null nếu chúng tôi được kết nối.

Cũng có những điều sau đây trong tâm trí:

Khi phát hành trước android.os.Build.VERSION_CODES # N, đối tượng này chỉ nên được lấy từ Ngữ cảnh # getApplicationContext () chứ không phải từ bất kỳ bối cảnh dẫn xuất nào khác để tránh rò rỉ bộ nhớ trong quá trình gọi.

Trong Bản kê khai, đừng quên thêm:

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

Mã đề xuất là:

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

Các NetworkInfolớp bị phản đối như cấp API 29, cùng với các phương pháp truy cập có liên quan như ConnectivityManager#getNetworkInfo()ConnectivityManager#getActiveNetworkInfo().

Các tài liệu hiện nay cho thấy người sử dụng ConnectivityManager.NetworkCallbackAPI để theo dõi callback asynchronized, hoặc sử dụng ConnectivityManager#getNetworkCapabilitieshoặc ConnectivityManager#getLinkPropertiesđể truy cập đồng bộ thông tin mạng

Thay vào đó, người gọi nên sử dụng API ConnectivityManager.NetworkCallback để tìm hiểu về các thay đổi kết nối hoặc chuyển sang sử dụng ConnectivityManager # getNetworkCapabilities hoặc ConnectivityManager # getLinkProperives để nhận thông tin một cách đồng bộ.


Để kiểm tra xem WiFi có được kết nối hay không, đây là mã tôi sử dụng:

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

Hãy nhớ thêm quyền ACCESS_NETWORK_STATEvào tệp Manifest của bạn.


2

Hãy thử phương pháp này.

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

Phương pháp này sẽ giúp tìm kết nối internet có sẵn hay không.


1
Tôi đã tìm kiếm cụ thể nếu kết nối hoạt động là wifi. Ngoài ra, không cần thực hiện kiểm tra null trên conMgr, nó sẽ không bao giờ là null.
Nathan Schwermann

Bạn có thể kiểm tra câu hỏi này xin vui lòng? :(
Skizo-ozᴉʞS

2

Điều này làm việc cho tôi:

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

Và thêm quyền này:

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

2

Nhiều câu trả lời sử dụng mã không dùng nữa hoặc mã có sẵn trên các phiên bản API higer. Bây giờ tôi sử dụng một cái gì đó như thế này

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

Đây là những gì tôi sử dụng như một phương thức tiện ích trong các ứng dụng của mình:

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

Thật tốt khi chỉ ra rằng phương thức isConnectedOrConnecting rất quan trọng khi bạn đang kiểm tra thiết lập kết nối. Phương pháp IsConnected không hoạt động với tôi.
vincent

1

Trong phiên bản Android mới

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

    }
}

và thêm tiền đề


connManager.getAllNetworks()yêu cầu API cấp 21.
Jawand Singh

1

Tương tự như câu trả lời của @Jason Knight, nhưng theo cách của Kotlin:

val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

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

ConnectivityManager.TYPE_WIFIkhông được chấp nhận
Jérôme Pietri

0

Đây là một giải pháp dễ dàng hơn. Xem câu hỏi về Stack Overflow Kiểm tra Wi-Fi có bật hay không trên Android .

PS Đừng quên thêm mã vào tệp manifest.xml để cho phép. Như hình dưới đây.

<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

Thử

wifiManager.getConnectionInfo().getIpAddress()

Điều này trả về 0 cho đến khi thiết bị có kết nối có thể sử dụng (trên máy của tôi, Samsung SM-T280, Android 5.1.1).


0

Bạn có thể bật WIFI nếu nó không được kích hoạt như sau 1. kiểm tra trạng thái WIFI như được trả lời bởi @Jason Knight 2. nếu không được kích hoạt, hãy kích hoạt nó đừng quên thêm quyền WIFI trong tệp kê khai

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

Lớp Java của bạn phải như thế

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

Thêm phần này cho 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;
        }
    }

trong tệp Manifest thêm các quyền sau:

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

0

Loại cũ một câu hỏi nhưng đây là những gì tôi sử dụng. yêu cầu tối thiểu api cấp 21 cũng phải xem xét apis Networkinfo không dùng nữa.

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.