【问题标题】:WIFI_STATE_CHANGED_ACTION intent not received upon connection to WiFi access point?连接到 WiFi 接入点时未收到 WIFI_STATE_CHANGED_ACTION 意图?
【发布时间】:2011-07-06 11:37:19
【问题描述】:

我的应用程序的部分功能是扫描并显示 WiFi 接入点列表,然后连接到用户选择的接入点。我有这个功能工作。现在,我还希望在连接“通过”时得到通知。这应该很简单,但我发现自己绊倒了。

我已经阅读了 SO 这里的各种帖子,他们都提到注册 WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTIONWifiManager.WIFI_STATE_CHANGED_ACTION。但是,这些都不适合我。任何人都可以在此代码中发现任何错误吗? (我省略了进行扫描的部分)

预期行为: 一旦连接成功(即,当我在通知栏上看到“已连接”图标时),应该会收到广播并且我应该看看吐司。

观察到的行为: 应用程序首次启动时接收到广播,每当我切换回它时(即,每当调用 onResume() 时;或者我怀疑,每当我注册意图时)

public class WifiScanActivity extends Activity {

    WifiManager mainWifi;
    WifiReceiver mWifiReceiver;
    IntentFilter mIntentFilter;
    private final static String TAG = "WifiScanActivity";
    public static final String INTENT_FOR_WIFI_CONNECTED =
            WifiManager.WIFI_STATE_CHANGED_ACTION;
    // public static final String INTENT_FOR_WIFI_CONNECTED =
    // WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        mWifiReceiver = new WifiReceiver();
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        mIntentFilter.addAction(INTENT_FOR_WIFI_CONNECTED);
        registerReceiver(mWifiReceiver, mIntentFilter);
        mainWifi.startScan();
    }

    protected void onPause() {
        unregisterReceiver(mWifiReceiver);
        super.onPause();
    }

    protected void onResume() {
        registerReceiver(mWifiReceiver, mIntentFilter);
        super.onResume();
    }

    class WifiReceiver extends BroadcastReceiver {

        public void onReceive(Context c, Intent intent) {
            Log.d(TAG,
                "In WifiReceiver: Broadcast Received = " + intent.getAction());
            if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent
                .getAction())) {
                // Display the ListView and connect to the selected AP
            } else if (INTENT_FOR_WIFI_CONNECTED.equals(intent.getAction())) {
                if (WifiManager.WIFI_STATE_ENABLED == intent.getIntExtra(
                    WifiManager.EXTRA_WIFI_STATE, 0)) {
                    displayNetworkInfo();
                }
                /*if(true == intent.getBooleanExtra(
                 * WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){
                 *  displayNetworkInfo();
                }*/
            }
        }
    }

    private void displayNetworkInfo() {
        WifiInfo wifiInfo = mainWifi.getConnectionInfo();
        String ssid = wifiInfo.getSSID();
        int ip = wifiInfo.getIpAddress();
        String message = "Connection established.\nSSID = " + ssid
            + "; IP Address = " + Helper.displayIpAddress(ip);
        Log.d(TAG, message);
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

如果我取消注释 WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION 的代码,我根本看不到正在接收广播。

注意:我知道连接成功,因为我在 Android 的 wifi 设置屏幕中看到了状态。

【问题讨论】:

    标签: android android-wifi


    【解决方案1】:

    好的,我想通了。事实证明我注册的是错误的意图。我应该使用 WifiManager.NETWORK_STATE_CHANGED_ACTION.

    以下是相关代码部分的sn-ps:

    mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) ;
    mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    
    
    public void onReceive(Context c, Intent intent) {
    
    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
    
        NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
        if(NetworkInfo.State.CONNECTED.equals(nwInfo.getState())){//This implies the WiFi connection is through
            displayNetworkInfo();
        }
    }
    

    【讨论】:

    • 在代码中添加SCAN_RESULTS_AVAILABLE_ACTION 有什么意义?
    • WifiManager.WIFI_STATE_CHANGED_ACTION == WifiManager.NETWORK_STATE_CHANGED_ACTION 根据文档
    【解决方案2】:

    将这些权限添加到清单以检测广播后,我能够检测到:

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

    【讨论】:

      【解决方案3】:

      要在状态更改后获取广播,请参阅this

      【讨论】:

      • 您链接到的文章显示了如何在扫描结果可用时接收广播。我的应用程序已经成功地做到了。我需要的是在与接入点的 WiFi 连接成功后立即获得广播。我在文章中没有看到任何与此相关的内容。
      猜你喜欢
      • 2011-07-13
      • 2015-08-31
      • 2014-01-21
      • 1970-01-01
      • 2013-02-11
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多