144

WIFI経由でネットワークに接続できるかどうかを検出する必要があります。有効なネットワーク接続が確立されたことを確認するために送信されるブロードキャスト。HTTPの有効なネットワーク接続が存在することを検証する必要があります。有効な接続が存在することを知るために、何を聞く必要があり、どのような追加のテストを行う必要がありますか。

4

15 に答える 15

128

BroadcastReceiverWiFi接続が確立されたとき(または接続が変更されたとき)に通知されるように登録できます。

登録BroadcastReceiver

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

そして、あなたの中でBroadcastReceiverこのようなことをします:

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
        if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
            //do stuff
        } else {
            // wifi connection was lost
        }
    }
}

詳細については、BroadcastReceiverおよびのドキュメントを参照してください。WifiManager

もちろん、この前にデバイスがすでにWiFiに接続されているかどうかを確認する必要があります。

編集:ban-geoengineeringのおかげで、デバイスがすでに接続されているかどうかを確認する方法は次のとおりです。

private boolean isConnectedViaWifi() {
     ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
     return mWifi.isConnected();
}
于 2011-05-04T22:24:00.367 に答える
107

私のために働いた最高のもの:

Androidマニフェスト

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>

BroadcastReceiver クラス

public class WifiReceiver extends BroadcastReceiver {

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

      NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if(info != null && info.isConnected()) {
        // Do your work. 

        // e.g. To check the Network Name or other info:
        WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
      }
   }
}

権限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
于 2014-03-25T06:13:48.503 に答える
18

私にとってはうまくいくだけWifiManager.NETWORK_STATE_CHANGED_ACTIONです。

ブロードキャスト レシーバーを登録します。

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

そして受け取る:

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

    final String action = intent.getAction();

    if(action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
        NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        boolean connected = info.isConnected();

        //call your method
    }      
}
于 2013-08-22T12:58:40.430 に答える
11

ユーザー @JPM と @usman による回答は非常に役に立ちます。それは正常に動作しますが、私onReceiveの場合は4回複数回発生するため、コードは複数回実行されます。

私はいくつかの変更を行い、私の要件に従って作成しましたが、今では1回しか来ません

これは、ブロードキャスト用の Java クラスです。

public class WifiReceiver extends BroadcastReceiver {

String TAG = getClass().getSimpleName();
private Context mContext;

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

    mContext = context;


    if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
                networkInfo.isConnected()) {
            // Wifi is connected
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            String ssid = wifiInfo.getSSID();

            Log.e(TAG, " -- Wifi connected --- " + " SSID " + ssid );

        }
    }
    else if (intent.getAction().equalsIgnoreCase(WifiManager.WIFI_STATE_CHANGED_ACTION))
    {
        int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        if (wifiState == WifiManager.WIFI_STATE_DISABLED)
        {
            Log.e(TAG, " ----- Wifi  Disconnected ----- ");
        }

    }
}
}

AndroidManifest で

<receiver android:name=".util.WifiReceiver" android:enabled="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>


<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
于 2016-03-10T10:32:47.023 に答える
10

毎回尋ねる通常の動作をオーバーライドする選択肢をユーザーに与えると、wifi 接続を開始 できます。

私は3つの方法を使用することを選択します...

public boolean isOnline() 
{
 ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
 return (networkInfo != null && networkInfo.isConnected());
}  

これは、Wifi または CellData のいずれかでインターネットに接続されているかどうかを簡単に確認するためのものです。ここから、実行するアクションを選択できます。機内モードかどうかも確認する必要があります。

別のスレッドで。変数 IpAddress を = " " に設定し、有効な IP アドレスが得られるまでポーリングします。

  WifiManager wifi;
  wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
  WifiInfo wifiInfo = wifi.getConnectionInfo();
  int ipAddress = wifiInfo.getIpAddress();
  String ip = null;
  ip = String.format("%d.%d.%d.%d",
  (ipAddress & 0xff),
  (ipAddress >> 8 & 0xff),
  (ipAddress >> 16 & 0xff),
  (ipAddress >> 24 & 0xff));
  Log.e(" >>IP number Begin ",ip);

別のコードスニペット...オンになっていない場合はオンにします(ユーザーの事前の許可を得て)

   if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true);  
于 2012-07-09T08:49:48.430 に答える
3

これは、Wifi に接続されている場合にのみ通信を許可するというユーザー設定を考慮した、私のコードの例です。

IntentServiceダウンロードを試みる前に、このコードを内部から呼び出しています。

いかなる種類のネットワーク接続もない場合にNetworkInfo注意してください。null

private boolean canConnect()
{
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    boolean canConnect = false;
    boolean wifiOnly = SharedPreferencesUtils.wifiOnly();

    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if(networkInfo != null)
    {
        if(networkInfo.isConnected())
        {
            if((networkInfo.getType() == ConnectivityManager.TYPE_WIFI) ||
               (networkInfo.getType() != ConnectivityManager.TYPE_WIFI && !wifiOnly))
            {
                canConnect = true;
            }
        }
    }

    return canConnect;
}
于 2012-08-23T18:03:11.467 に答える
2

私はこのコードを使用しました:

public class MainActivity extends Activity
    {
    .
    .
    .
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        .
        .
        .
        }

    @Override
    protected void onResume()
        {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        registerReceiver(broadcastReceiver, intentFilter);  
        }

    @Override
    protected void onPause()
        {
        super.onPause();
        unregisterReceiver(broadcastReceiver);
        }

    private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context context, Intent intent)
            {
            final String action = intent.getAction();
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION))
                {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false))
                    {
                    // wifi is enabled
                    }
                else
                    {
                    // wifi is disabled
                    }
                }
            }
        };
    }
于 2013-10-25T21:15:48.223 に答える
2

CONNECTIVITY_CHANGEブロードキャストを楽しんでいるすべての人は、Android O でアプリがバックグラウンドにある場合、これが発生しないことに注意してください。

https://developer.android.com/about/versions/o/background.html

于 2017-08-22T15:19:43.683 に答える
0

フィルターでブロードキャストを使用できます

 <receiver
        android:name=".receivers.ConnectionType"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

その後、そのように返された値を聞くことができます

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

    int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
    if(wifiState==WifiManager.WIFI_STATE_ENABLED){
        Toast.makeText(context, "WIFI on", Toast.LENGTH_SHORT).show();

    }else if(wifiState==WifiManager.WIFI_STATE_DISABLED) {
        Toast.makeText(context, "WIFI OFF", Toast.LENGTH_SHORT).show();
    }


}

WIFIが有効または無効になるたびに起動します

于 2021-06-08T17:50:23.103 に答える