web-dev-qa-db-ja.com

Wifi接続-切断リスナー

Wifiが接続/切断した場合、クラスはどのコードを自動的にコードをチェックするために実装する必要がありますか?

私は手動でwifi接続/切断を確認できますが、毎回Android設定からWIFIを接続/切断し、結果を得るためにプログラムを実行する必要があります。

私の現在のコードは次のように簡単です:

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

実際には、Wi-Fiがenabledであるかどうかをチェックしていますが、それは必ずしもconnected。これは、電話機の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");    
    }   
};

アクティブなネットワーク情報にアクセスするには、次のuses-permissionを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>

編集:Lollipopでは、ユーザーが未測定のネットワーク接続に接続したときにアクションを実行しようとしている場合、ジョブスケジューリングが役立つ場合があります。ご覧ください: http://developer.Android.com/about/versions/Android-5.0.html#Power


編集2:別の考慮事項は、私の答えはあなたがインターネットに接続していることをチェックしないことです。サインインが必要なWi-Fiネットワークに接続できます。以下に便利な「IsOnline()」チェックを示します。 https://stackoverflow.com/a/27312494/1140744

75
warbi

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>

Intentの使用の説明については、 WIFI_STATE_CHANGED_ACTION および CONNECTIVITY_ACTION を参照してください。

18
Squonk

Javadocの次の2つのページを確認してください。 ConnectivityManagerWiFiManager

それぞれがブロードキャストアクションを定義していることに注意してください。ブロードキャストレシーバーの登録についてさらに学習する必要がある場合は、これを確認してください。 プログラムでブロードキャストレシーバーを登録する

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>

編集:

アプリの実行中にのみブロードキャストを受信する必要がある場合は、マニフェストではなくコードでこのブロードキャストレシーバーを登録する方が良いと付け加えます。マニフェストで指定することにより、以前に実行されていなかった場合でも、プロセスに接続の変更が通知されます。

14
Tanner Perrien

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>
3
Aung Thuya

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

コールバックが発生した後にリスナーが削除されることに注意してください。これは静的リスナーであるためです。とにかく、この実装は私のために機能し、あなたのアクティビティにフックする1つの方法であり、どこでも静的です。

1
Danuofr