2012-02-19 45 views
26

Tôi cần phát hiện khi có kết nối mạng với mạng WIFI SPECIFIC.Android WIFI Cách phát hiện khi kết nối WIFI cụ thể có sẵn

Ví dụ: Ngay khi bạn bước vào nhà và điện thoại của bạn chọn mạng Wi-Fi tại nhà, tôi muốn thông báo cho biết "Bạn không ở trong mạng gia đình, bạn muốn kết nối với bạn ? " Nhưng tôi muốn điều đó chỉ xảy ra khi tôi ở nhà cụ thể của mình.

Tôi nên lắng nghe điều gì và tôi nên làm gì để đảm bảo đó là mạng gia đình cụ thể của tôi chứ không phải mạng khác?

+0

[đoạn mã hoạt động] này (http://stackoverflow.com/a/15976165/1166727) trích xuất mọi thứ từ kết nối wifi, mạng lưu trữ trên thiết bị và mạng khả dụng trong "cảnh" của thiết bị. –

Trả lời

27

Bạn có thể sử dụng BroadcastReceiver để tìm hiểu rằng mạng wifi đã thay đổi:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); 

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
context.registerReceiver(broadcastReceiver, intentFilter); 

Các BroadcastReceiver có thể trông như thế này. Và để kiểm tra địa chỉ MAC cụ thể, hãy xem phương thức checkConnectedToDesiredWifi() bên dưới.

public class WifiBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) { 
      SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 
      if (SupplicantState.isValidState(state) 
        && state == SupplicantState.COMPLETED) { 

       boolean connected = checkConnectedToDesiredWifi(); 
      } 
     } 
    } 

    /** Detect you are connected to a specific network. */ 
    private boolean checkConnectedToDesiredWifi() { 
     boolean connected = false; 

     String desiredMacAddress = "router mac address"; 

     WifiManager wifiManager = 
      (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 

     WifiInfo wifi = wifiManager.getConnectionInfo(); 
     if (wifi != null) { 
      // get current router Mac address 
      String bssid = wifi.getBSSID(); 
      connected = desiredMacAddress.equals(bssid); 
     } 

     return connected; 
    } 
} 
12

Miễn là chúng tôi không có gì giống như mã số như bạn cần, miễn phí dịch vụ, tôi chỉ có thể khuyên bạn đọc mọi thứ có thể về Android và khả năng Mạng/Wifi của nó.

  • Nguồn bạn nên đọc và nghiên cứu

http://developer.android.com/reference/android/net/wifi/package-summary.html
how to see if wifi is connected in android
How to get my wifi hotspot ssid in my current android system
How to get name of wifi-network out of android using android API?
Get Wifi Interface name on Android

  • Permissions bạn nên yêu cầu cho wh en tạo ứng dụng manifest

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

(người cuối cùng, chỉ có nếu bạn muốn nó để phát hiện vị trí của bạn, để ngăn chặn các cuộc gọi không cần thiết)

  • Bạn cũng nên tuyên bố , ứng dụng của bạn cần wifi để có sẵn trong thiết bị, để hoạt động bình thường:

AndroidManifest.xml

<uses-feature android:name="android.hardware.wifi" /> 
+1

Xin chào, cảm ơn rất nhiều. Tôi sẽ đọc những thứ này. Đây là câu hỏi đầu tiên của tôi về stackoverflow. Cám ơn phản hồi của bạn. – ECH5030

+1

@ ECH5030 Bạn đang chào đón sir. Đừng quên sau đó đánh dấu một số câu trả lời, như được chấp nhận, đó là những gì bạn chỉ có thể làm. Đó là cách phổ biến để đóng chuỗi câu hỏi trên các trang web QA :) –

3

Sử dụng mã tiêu chuẩn để liệt kê tất cả các mạng có sẵn:

  • bắt đầu quét

    String connectivity_context = Context.WIFI_SERVICE; 
          final WifiManager wifi = (WifiManager) getSystemService(connectivity_context); 
    if (wifi.isWifiEnabled()) { 
             wifi.startScan(); 
            } 
    
  • đăng ký một máy thu cho các dữ liệu

    IntentFilter i = new IntentFilter(); 
    i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
    
    BroadcastReceiver receiver = new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context context, Intent i) { 
         // TODO Auto-generated method stub 
         ScanWiFiActivity a = ScanWiFiActivity.instance(); 
         WifiManager w = (WifiManager) context 
           .getSystemService(Context.WIFI_SERVICE); 
         List<ScanResult> l = w.getScanResults(); 
         a.Clear(); 
         for (ScanResult r : l) { 
               //use r.SSID or r.BSSID to identify your home network and take action 
          a.setText(r.SSID + "" + r.level + "\r\n"); 
         } 
        } 
    }; 
    registerReceiver(receiver, i); 
    

Trong CHO khối làm việc kỳ diệu của bạn và có hành động khi bạn xác định mạng của bạn bằng cách SSID hoặc BSSID

+0

Điều này làm việc người đàn ông tuyệt vời! – Saaram

2

Tôi đã có cùng một vấn đề với dự án của tôi và phải mất một lúc để tìm giải pháp.

Trước hết, "kết nối với Wi-Fi" là điều gì đó rất trừu tượng và hóa ra là đúng. Trong thực tế, người ta thường có nghĩa là tất cả các nội dung sau:

  • chứng thực với một điểm truy cập WiFi
  • kết hợp với các điểm truy cập
  • có một địa chỉ IP từ mạng

Tất cả những giai đoạn (và nhiều hơn nữa) được kết hợp với các sự kiện Andoid khác nhau. Vì vậy, không có thêm ado, đây là của tôi (sửa đổi đôi chút) mã:

public class MyService extends Activity { // or Service 

    //... Other stuff 

    BroadcastReceiver awaitIPAddress = null; 
    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { 
       if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) { 
        //WiFi is associated 
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
        WifiInfo wi = wifiManager.getConnectionInfo(); 
        if (wi != null) { 
         // Wifi info available (should be, we are associated) 
         if (wi.getIpAddress() != 0) { 
          // Lucky us, we already have an ip address. 
          // This happens when a connection is complete, e.g. after rekeying 
          if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { 
           // ... Do your stuff here 
           // ... 
           // ... 
          } 
         } else { 
          // No ip address yet, we need to wait... 
          // Battery friendly method, using events 
          if (awaitIPAddress == null) { 
           awaitIPAddress = new BroadcastReceiver() { 
            @Override 
            public void onReceive(Context ctx, Intent in) { 
             WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
             WifiInfo wi = wifiManager.getConnectionInfo(); 
             if (wi != null) { 
              if (wi.getIpAddress() != 0) { 
               if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { 
                // ... Do your stuff here 
                // ... 
                // ... 
               } 
              } 
             } else { 
              ctx.unregisterReceiver(this); 
              awaitIPAddress = null; 
             } 
            } 
           }; 
           // We register a new receiver for connectivity events 
           // (getting a new IP address for example) 
           context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
          } 
         } 
        } 
       } else { 
        // wifi connection not complete, release ip address receiver if registered 
        if (awaitIPAddress != null) { 
         context.unregisterReceiver(awaitIPAddress); 
         awaitIPAddress = null; 
        } 
       } 
      } 
     } 
    }; 

    //... Other stuff 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //... Other stuff 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); 
     registerReceiver(receiver, filter); 
     //... Other stuff 
    } 

    //... Other stuff 

} 

Ngoài ra, đừng bỏ qua các điều khoản phù hợp với biểu hiện:

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

Và tôi rất nghi ngờ bạn cũng sẽ cần :

<uses-permission android:name="android.permission.INTERNET"/> 
Các vấn đề liên quan