2011-06-15 211 views
43

我的班級必須實現哪個監聽器才能自動檢查代碼是否連接/斷開連接?Wifi連接 - 斷開監聽器

我可以手動檢查WiFi連接/斷開連接,但每次需要連接/斷開WIFI從android設置,然後運行我的程序的結果。

我當前的代碼很簡單,只要:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if (wifi.isWifiEnabled()==true) 
{ 
    tv.setText("You are connected"); 
} 
else 
{ 
    tv.setText("You are NOT connected"); 
} 

回答

13

退房的javadoc的這兩個頁面: ConnectivityManager WiFiManager

注意,每一個定義廣播動作。如果您需要了解更多有關注冊的廣播接收器,檢查了這一點: Programmatically register a broadcast receiver

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    if (wifi.isWifiEnabled()) { 
     tv.setText("You are connected"); 
    } else { 
     tv.setText("You are NOT connected"); 
    } 
    } 
}; 

而在你的清單,你可以做這樣的事情(如果你寧願不登記在代碼中的接收器):

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <receiver android:name=".WiFiReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
     </intent-filter> 
    </receiver> 
</application> 

編輯:

我要補充,這將是更好地登記在你的代碼這個廣播接收器,而不是在清單中,如果您只需在應用程序運行時接收廣播。通過在清單中指定它,即使它以前沒有運行,您的進程也會收到連接更改的通知。

+0

謝謝Tanner!將嘗試。 – Neha 2011-06-17 19:22:10

+1

我建議您編輯您的代碼並明確參考上下文:「WifiManager wifi =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);」否則,如果在單獨的類中使用,則可能會出現「getSystemService()」錯誤。 – 2012-07-20 14:54:48

17

創建自己的類,它擴展了BroadcastReceiver ...

public class MyNetworkMonitor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Process the Intent here 

    } 
} 

在AndroidManifest.xml

<receiver 
    android:name=".MyNetworkMonitor" > 
     <intent-filter> 
      <action android:name="android.net.wifi.STATE_CHANGE" /> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
</receiver> 

使用意向的解釋請參見WIFI_STATE_CHANGED_ACTIONCONNECTIVITY_ACTION

+0

謝謝MisterSquonk。將嘗試。 – Neha 2011-06-17 19:23:26

+0

那些來自WifiManager @Squonk的變量? – gumuruh 2014-07-21 10:32:54

+0

@gumuruh WIFI_STATE_CHANGED_ACTION屬於WifiManager類,CONNECTIVITY_ACTION屬於ConnectivityManager。你可能想要檢查更多的連接類型,即如果移動網絡可用,那麼你應該問活動網絡,在那裏你可以得到NetworkInfo( - >類型)ConnectionManager.TYPE_MOBILE ... – 2014-12-19 12:58:04

67

其實你正在檢查是否啓用了,這並不意味着它是連接。這僅表示手機上的Wi-Fi模式已啓用,並且能夠連接到Wi-Fi網絡。

這是我在聽在我的廣播接收器的實際Wi-Fi連接:

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) {  
     ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
      Log.d("WifiReceiver", "Have Wifi Connection"); 
     else 
      Log.d("WifiReceiver", "Don't have Wifi Connection");  
    } 
}; 

爲了獲得你需要以下用途的許可添加到您的AndroidManifest活動的網絡信息。 XML:

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

而下面的意圖接收器(或者你可以以編程方式添加此...)

<!-- Receive Wi-Fi connection state changes --> 
<receiver android:name=".WifiReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

編輯:在棒棒糖中,如果您要在用戶連接到未定義的網絡連接時執行操作,作業計劃可能會有所幫助。請看:http://developer.android.com/about/versions/android-5.0.html#Power


編輯2:另一個考慮是,我的回答不會檢查是否有到互聯網連接。您可以連接到Wi-Fi網絡,需要您登錄這裏是一個有用的「IsOnline()」檢查:https://stackoverflow.com/a/27312494/1140744

+0

這很棒,但我怎麼能在我的活動中使用它? – sabsab 2015-01-26 23:27:22

+0

它被調用兩次。我得到這兩次,WifiReceiver:有無線連接 – 2017-08-13 12:43:19

+0

'android.net.conn.CONNECTIVITY_CHANGE'已棄用。現在什麼是解決方案? – 2017-11-15 10:50:24

3

AndroidManifest.xml中添加以下權限。

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

創建新的Receiver類。

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

     if (activeNetInfo != null 
      && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show(); 
     } 
    } 

,並添加接收器類的AndroidManifest.xml文件。

<receiver android:name="ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
1

作爲對sabsab的迴應。爲了連接到Connectivity Change廣播接收器,我使用了warbi的答案並添加了一個靜態方法的類。

public class WifiHelper 
{ 
    private static boolean isConnectedToWifi; 
    private static WifiConnectionChange sListener; 

    public interface WifiConnectionChange { 
     void wifiConnected(boolean connected); 
    } 

    /** 
    * Only used by Connectivity_Change broadcast receiver 
    * @param connected 
    */ 
    public static void setWifiConnected(boolean connected) { 
     isConnectedToWifi = connected; 
     if (sListener!=null) 
     { 
      sListener.wifiConnected(connected); 
      sListener = null; 
     } 
    } 

    public static void setWifiListener(WifiConnectionChange listener) { 
     sListener = listener; 
    } 
} 

然後,我對上面顯示的第一個答案的接收器類進行了更改。

public class ConnectivityReceiver extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
    { 
     Log.d("WifiReceiver", "Have Wifi Connection"); 
     WifiHelper.setWifiConnected(true); 
    } else 
    { 
     Log.d("WifiReceiver", "Don't have Wifi Connection"); 
     WifiHelper.setWifiConnected(false); 
    } 

} 
} 

最後,在您的活動中,您可以添加一個偵聽器來利用此回調。

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING); 
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange() 
    { 
     @Override 
     public void wifiConnected(boolean connected) 
     { 
      //Do logic here 
     } 
    }); 

注意,在回調觸發後,偵聽器被刪除,這是因爲它是一個靜態偵聽器。無論如何,這個實現對我來說是有效的,並且是鉤住你的活動的一種方式,或者在任何地方使它成爲靜態的。