1

我正在制作一个用户需要连接到本地 wifi 网络的应用程序。当用户打开应用程序时,我检查是否连接了 wifi,然后检查它们是否连接到正确的路由器。

我编写了我的应用程序,以便在 WIFI_STATE_CHANGED_ACTION、SCAN_RESULTS_AVAILABLE_ACTION 和 SUPPLICANT_CONNECTION_CHANGED_ACTION 上的 BroadcastReceivers 之后调用 CheckWifiConnection()。

当用户在禁用 wifi 的情况下启动时,我的应用程序崩溃。出现警报,要求打开 wifi。启用 wifi 后,BroadcastReceiver 调用 CheckWifiConnection() 并在 info.getSSID() 上崩溃说: error receiving broadcast intent act=android.net.wifi.wifi_state_changed

它崩溃是因为我在收音机打开后正在连接到 wifi 网络。如果我只是简单地放入一个 Handler.postDelayed 调用,那么它就可以工作。

这是相关的代码。我的清单文件的一大块:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

/********************* Wifi Related Functions **********************/
private boolean CheckWifiConnection() {
    // Connect to Wifi if not enabled
    if (wifiManager.isWifiEnabled() == false) {
        Log.d(TAG,"Wifi not on");
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("This app needs Wifi On");
        builder.setMessage("Is that OK?");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                wifiManager.setWifiEnabled(true);
                Log.d(TAG,"Turning WIFI on");
            }
        });
        builder.setNeutralButton("NO", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                // For the time being connect to WIFI anyway
                // Probably change to a toast and exit program
                wifiManager.setWifiEnabled(true);
            }
        });
        checkWifiStatus = true;

        builder.show();
        return false;
    }

    Log.d(TAG,"Wifi is On");

    // See if they are connected to configured router
    WifiInfo info = wifiManager.getConnectionInfo();
    Log.d(TAG,"Have Wifi Info");
    if ( info.getSSID().matches(router) == false) {
        // Do a scan to see if they can see us
        wifiManager.startScan();
        Log.d(TAG,"Starting Network Scan");
        return false;
    }

    return true;

} 


private BroadcastReceiver wifiConnectionChanged = new BroadcastReceiver() {
    public void onReceive(Context c, Intent i){
        if (checkWifiStatus && wifiManager.isWifiEnabled()) {
            Log.d(TAG,"WIFI is now on");
            checkWifiStatus = false;
            CheckWifiConnection();
        }       
    }

};

当我连接到 Wifi 网络时,有没有办法检查我是否正在连接到路由器和/或广播接收器?我觉得暂停我的代码就是承认失败,并且可能会导致问题。

此外,如果有更好的方法来完成所有这些检查,我愿意接受建议。

4

1 回答 1

0

NagarjunaReddy,您的链接使我找到了解决方案。如果 wifi 天线正在连接过程中,则 info 不为空,但 info.getSSID() 为空。因此,最好这样写:

WifiInfo info = WifiManager.getConnectionInfo();
if (info.getSSID() != null) {
    String ssid = info.getSSID();
    ...
}

我不知道这样写会不会有点矫枉过正:

if (info != null && info.getSSID() != null)

此外,建立连接时我需要监控的 BroadcastReceiver 是 WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION。事实证明,我的 onResume() 中有一个复制和粘贴错误,而且我并没有真正注册 WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION。

于 2012-03-18T02:50:30.117 回答