【问题标题】:android.net.wifi.STATE_CHANGE: not triggered on Wifi disconnectandroid.net.wifi.STATE_CHANGE:在 Wifi 断开连接时未触发
【发布时间】:2011-03-19 22:35:59
【问题描述】:

当 Wifi 连接恢复时,只有具有动作 NETWORK_STATE_CHANGED_ACTION(其常量值为 android.net.wifi.STATE_CHANGE)的广播意图是否正常? IE。当 Wifi 断开连接时,我没有得到这个意图。

更新:我最感兴趣的是 >= 2.2 Froyo

【问题讨论】:

  • 我几个星期都遇到同样的问题,我认为这很正常(或错误;))。我知道这无济于事,但仅供参考...
  • 只是为了向未来的读者澄清:该意图是针对 wifi 收发器的状态(禁用、启用、启用、禁用),基本上告诉您 wifi 是打开还是关闭。您正在寻找不同的连接状态。
  • @JeffE: nope - "android.net.wifi.STATE_CHANGE" 对应于用于网络连接的NETWORK_STATE_CHANGED_ACTIONWIFI_STATE_CHANGED_ACTION 用于启用、禁用等 - 对应于 "android.net.wifi.WIFI_STATE_CHANGED" 请删除您令人困惑的评论。对于 OP - 我认为 M Granja 的答案是正确的

标签: android wifi wifimanager


【解决方案1】:

公共静态最终字符串 SUPPLICANT_CONNECTION_CHANGE_ACTION

自:API 级别 1

广播意图 指示连接到的操作 请求者已成立 (现在可以执行 Wi-Fi 操作)或连接到 请求者已经丢失。一 extra 提供连接状态为 一个布尔值,其中 true 表示已连接。

另见

EXTRA_SUPPLICANT_CONNECTED

常量值:“android.net.wifi.supplicant.CONNECTION_CHANGE”

在 android 的 API 中,它说检查 STATE_CHANGE 的网络连接不是一个好主意,而是应该使用 SUPPLICANT_CONNECTION_CHANGE_ACTION。这将注意到 wifi 网络的建立,以及 wifi 网络的断开。我不知道这是否对你有帮助,但我希望如此。 LINK

【讨论】:

  • 我现在在“断开连接”时收到一个连接更改事件!谢谢!
  • 我不知道,但 SUPPLICANT_CONNECTION_CHANGE_ACTION 对我不起作用。它从未被解雇。我不得不使用 WifiManager.NETWORK_STATE_CHANGED_ACTION 来做同样的事情。它就像一个魅力!
【解决方案2】:

我在我的项目中也有类似的需求,最终不得不同时使用两者。

android.net.wifi.supplicant.CONNECTION_CHANGE 动作在网络连接时发送广播,但通常在设备有 IP 地址之前,所以我需要 android.net.wifi.STATE_CHANGE 动作。

android.net.wifi.STATE_CHANGE 操作仅在设备与网络断开连接但仍启用 wifi 时(例如,当热点超出范围时)在断开连接时接收广播

所以你应该将接收者的两个动作都放在清单中:

<receiver android:name="net.moronigranja.tproxy.WifiReceiver">
            <intent-filter>
                    <action android:name="android.net.wifi.STATE_CHANGE"/>
                    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" />
            </intent-filter>
</receiver>

然后你放一个 if 来检查意图中调用了哪个动作。这是我的代码中 BroadcastReceiver 的 onReceive 方法:

public void onReceive(Context c, Intent intent) {
      if(intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){ 
          boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
          if(!connected) {
               //Start service for disconnected state here
          }
      }

      else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){
          NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
          if( netInfo.isConnected() )
          {
              //Start service for connected state here.
          }   
      }
  }

【讨论】:

  • 尽管我为广播接收器使用了一个单独的类,但检查请求者是解决我的问题的关键。
  • 我不知道,但 SUPPLICANT_CONNECTION_CHANGE_ACTION 对我不起作用。它从未被解雇。我不得不使用 WifiManager.NETWORK_STATE_CHANGED_ACTION 来做同样的事情。它就像一个魅力!
  • 是的,NETWORK_STATE_CHANGED_ACTION 就像魅力一样,无需添加到清单中。
  • @unrealsoul007 真的很晚回答,但在当前的事态(棒棒糖+)中,我注意到每当连接/验证/获取 IP/断开连接流由系统触发时,我停止接收 SUPPLICANT_CONNECTION_CHANGE_ACTION 广播,而不是我的应用程序。所以我猜有一些进程隔离阻止了 BC 的检索,无论是在 Android 系统上,还是在低级 Linux 层上。几乎我正在评估用户应用程序无法在连接、带 IP、不带 IP、身份验证失败以及其他类型的请求者状态之间建立差异
  • 我也注意到了。但是,当无线断开连接时,如果禁用移动数据,您仍然会收到广播。
猜你喜欢
  • 1970-01-01
  • 2017-01-23
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多