我正在创建一个用户需要连接到本地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网络时,有没有办法检查我是否正在连接路由器和/或BroadcastReceiver?我觉得在我的代码中暂停是承认失败,并可能导致问题。
此外,如果有更好的方法进行所有这些检查,我愿意接受建议。
答案 0 :(得分:0)
NagarjunaReddy,你的链接让我走上正确的道路寻找解决方案。如果wifi天线正在连接过程中,则info不为null,但是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。