如何检测Android中何时建立WIFI连接?

And*_*der 136 android android-wifi

我需要检测何时通过WIFI进行网络连接.发送什么广播以确定已建立有效的网络连接.我需要验证HTTP的有效网络连接是否存在.我应该注意什么以及我需要做些什么其他测试才能知道存在有效连接.

jpm*_*jpm 124

您可以注册一个BroadcastReceiver建立WiFi连接时通知(或连接更改).

注册BroadcastReceiver:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

然后在你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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅文件BroadcastReceiverWifiManager

当然,在此之前您应该检查设备是否已连接到WiFi.

编辑:感谢ban-geoengineering,这是检查设备是否已连接的方法:

private boolean isConnectedViaWifi() {
     ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE);
     NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);     
     return mWifi.isConnected();
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,如果建立/丢失了与已知wifi站的连接,WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION不起作用.但WifiManager.NETWORK_STATE_CHANGED_ACTION确实有效. (9认同)
  • 嗯?我没有看到名为connection_change的操作?我只看到wifi状态已更改,但是该操作仅指示wifi是否已启用(或启用/禁用),而不是是否已连接。 (2认同)

M. *_*han 104

对我有用的最好的:

AndroidManifest

<receiver android:name="com.AEDesign.communication.WifiReceiver" >
   <intent-filter android:priority="100">
      <action android:name="android.net.wifi.STATE_CHANGE" />
   </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

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();
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)

  • 为了便于将来参考,该硬编码操作是[WifiManager.NETWORK_STATE_CHANGED_ACTION](http://developer.android.com/reference/android/net/wifi/WifiManager.html#NETWORK_STATE_CHANGED_ACTION). (4认同)
  • if(info!= null && info.isConnected())= no spaghetti. (3认同)
  • 我如何在 Android O 上执行此操作,因为像 android.net.wifi.STATE_CHANGE 这样的隐式广播接收器将不再被允许在清单中注册(请参阅 https://developer.android.com/guide/components/broadcast-exceptions .html)。如果我们在应用程序活动中注册它(例如 onCreate),那么它必须在 onStop() 中取消注册,并且我们将不再接收 wifi 相关事件。 (2认同)

Yar*_*Yar 17

对我来说只有WifiManager.NETWORK_STATE_CHANGED_ACTION作品.

注册广播接收器:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
Run Code Online (Sandbox Code Playgroud)

并收到:

@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
    }      
}
Run Code Online (Sandbox Code Playgroud)


Yog*_*uru 10

用户@JPM和@usman给出的答案非常有用.它工作正常,但在我的情况下,它在我的情况下onReceive多次出现4次,所以我的代码执行多次.

我做了一些修改,按照我的要求制作,现在只有一次

这是广播的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 ----- ");
        }

    }
}
}
Run Code Online (Sandbox Code Playgroud)

在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"/>
Run Code Online (Sandbox Code Playgroud)


use*_*716 8

可以,如果你给用户一个选择,覆盖每一次询问的正常行为启动WiFi连接.

我选择使用三种方法......

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

这是快速检查是否有互联网连接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);
Run Code Online (Sandbox Code Playgroud)

另一个代码片段...如果它没有打开(用户事先许可)

   if(wifi.isWifiEnabled()!=true)wifi.setWifiEnabled(true);  
Run Code Online (Sandbox Code Playgroud)


小智 7

为了检测WIFI连接状态,我使用了ConnectivityManager类的CONNECTIVITY_ACTION:

    IntentFilter filter=new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    registerReceiver(receiver, filter);
Run Code Online (Sandbox Code Playgroud)

并从您的BroadCastReceiver:

    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
        int networkType = intent.getIntExtra(
                android.net.ConnectivityManager.EXTRA_NETWORK_TYPE, -1);
        if (ConnectivityManager.TYPE_WIFI == networkType) {
            NetworkInfo networkInfo = (NetworkInfo) intent
                    .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null) {
                if (networkInfo.isConnected()) {

                    // TODO: wifi is connected
                } else {
                    // TODO: wifi is not connected
                }
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

ps:对我来说很好:)


Cod*_*way 5

此代码根本不需要许可.它仅限于Wi-Fi网络连接状态更改(不考虑任何其他网络).接收机静态发布在AndroidManifest.xml文件中,并不需要被导出,因为它会被系统调用protected broadcast,NETWORK_STATE_CHANGED_ACTION在每个网络连接状态的变化.

AndroidManifest:

<receiver
    android:name=".WifiReceiver"
    android:enabled="true"
    android:exported="false">

    <intent-filter>
        <!--protected-broadcast: Special broadcast that only the system can send-->
        <!--Corresponds to: android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION-->
        <action android:name="android.net.wifi.STATE_CHANGE" />
    </intent-filter>

</receiver>
Run Code Online (Sandbox Code Playgroud)

BroadcastReceiver类:

public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*
 Tested (I didn't test with the WPS "Wi-Fi Protected Setup" standard):
 In API15 (ICE_CREAM_SANDWICH) this method is called when the new Wi-Fi network state is:
 DISCONNECTED, OBTAINING_IPADDR, CONNECTED or SCANNING

 In API19 (KITKAT) this method is called when the new Wi-Fi network state is:
 DISCONNECTED (twice), OBTAINING_IPADDR, VERIFYING_POOR_LINK, CAPTIVE_PORTAL_CHECK
 or CONNECTED

 (Those states can be obtained as NetworkInfo.DetailedState objects by calling
 the NetworkInfo object method: "networkInfo.getDetailedState()")
*/
    /*
     * NetworkInfo object associated with the Wi-Fi network.
     * It won't be null when "android.net.wifi.STATE_CHANGE" action intent arrives.
     */
    NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

    if (networkInfo != null && networkInfo.isConnected()) {
        // TODO: Place the work here, like retrieving the access point's SSID

        /*
         * WifiInfo object giving information about the access point we are connected to.
         * It shouldn't be null when the new Wi-Fi network state is CONNECTED, but it got
         * null sometimes when connecting to a "virtualized Wi-Fi router" in API15.
         */
        WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
        String ssid = wifiInfo.getSSID();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

权限:

None
Run Code Online (Sandbox Code Playgroud)

  • 该功能适用​​于运行 &lt; API 26 的设备。正如 @Isham 所建议的,Android O 不再支持该操作 (2认同)

ces*_*nec 5

2020 年 11 月:

我处理过太多被 Google 弃用的项目。最后,我找到了一个解决方案,使用“registerNetworkCallback”来满足我的特殊要求,正如谷歌目前建议的那样。

我需要的是一种简单的方法来检测我的设备是否在 WIFI 中分配了 IPv4。(我没有尝试过其他情况,我的要求非常具体,但也许这种没有弃用元素的方法将作为其他情况的基础)。

在 API 23、24 和 26(物理设备)以及 API 28 和 29(模拟设备)上进行了测试。

    ConnectivityManager cm 
            = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder builder = new NetworkRequest.Builder();

    cm.registerNetworkCallback
            (
                    builder.build(),
                    new ConnectivityManager.NetworkCallback()
                    {
                        @Override
                        public void onAvailable(Network network)
                        {
                            //Actions to take with Wifi available.
                        }
                        @Override
                        public void onLost(Network network)
                        {
                            //Actions to take with lost Wifi.
                        }
                    }

            );
Run Code Online (Sandbox Code Playgroud)

(在“MainActivity.Oncreate”内部实现)

注意:在清单中需要“android.permission.ACCESS_NETWORK_STATE”


归档时间:

查看次数:

145728 次

最近记录:

6 年,7 月 前