55

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

Wi-Fiの接続/切断を手動で確認できますが、毎回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");
}
4

6 に答える 6

79

実際には、Wi-Fi が有効になっているかどうかを確認していますが、必ずしも接続されているとは限りません。これは、電話機の 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: もう 1 つの考慮事項は、私の回答では、インターネットに接続していることを確認していないことです。サインインが必要な Wi-Fi ネットワークに接続している可能性があります。便利な「IsOnline()」チェックを次に示します: https://stackoverflow.com/a/27312494/1140744

于 2012-10-15T10:56:53.033 に答える
18

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を参照してください。

于 2011-06-15T18:29:28.600 に答える
15

javadoc の次の 2 ページを確認してください。 ConnectivityManager WiFiManager

それぞれがブロードキャスト アクションを定義していることに注意してください。ブロードキャスト レシーバーの登録の詳細については、こちらをご覧ください: プログラムによるブロードキャスト レシーバーの登録

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>

編集:

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

Android 7.0 (API レベル 24) 以降を対象とするアプリは、マニフェストでブロードキャスト レシーバーを宣言している場合、このブロードキャストを受信しません。android.content.BroadcastReceiver} を android.content.Context#registerReceiver Context.registerReceiver() に登録し、そのコンテキストがまだ有効な場合、アプリは引き続きブロードキャストを受信します。

于 2011-06-15T18:25:13.030 に答える
3

AndroidManifest.xmlに次の権限を追加します。

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

新しいレシーバー クラスを作成します。

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>
于 2015-02-03T09:02:06.133 に答える
2

サブサブに応えて。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つの方法です。または、どこでも静的です。

于 2016-11-19T01:17:11.153 に答える