1

我是AndroidJava的完全菜鸟,我使用过C++和一点 C#。我正在尝试创建一个连接到Wifi网络的简单Android应用程序。问题是它在 addNetwork()函数上崩溃。

import android.net.ConnectivityManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        final WifiConfiguration wc = new WifiConfiguration();        
        String networkSSID = "********";
        String networkPass = "*******";      
        wc.SSID = "\"" + networkSSID + "\""; 
        wc.preSharedKey = "\""+ networkPass +"\"";
        wc.hiddenSSID = true;
        wc.status = WifiConfiguration.Status.ENABLED;
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
        int res = wifi.addNetwork(wc);
        wifi.enableNetwork(res, true);
        wifi.setWifiEnabled(true);
        ConnectivityManager connec = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

    }
    }

我正在使用目标为 2.3.3 版本的 Android 的项目开发 Eclipse(我的手机在 2.3.6 上)。除了此处的导入(MainActivity.java)之外,我是否必须包含其他文件?

编辑:在这个答案中找到这个问题的答案。我的附加问题的答案(我的网络列表附加了相应的 SSID,但是当我 101% 确定它是“不在范围内”时,因为那是我的路由器!你知道可能出了什么问题吗? ) 以及此处wifi 连接的完整操作方法。

4

2 回答 2

2

AndroidMainfest.xml 好吧,您是否在 Android 项目的根目录中声明了使用 ACCESS_WIFI_STATE 的权限。

只需打开它并将其放在应用程序标签的上方或下方

像这样

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
于 2013-07-05T17:45:17.977 回答
1

请参阅此答案以获取更多信息,我从这里提取了这个

对于 WEP 网络,您需要这样做:

ws.wepKeys[0] = "\"" + networkPass + "\""; 
ws.wepTxKeyIndex = 0;
ws.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
ws.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 

对于 WPA 网络,您需要像这样添加密码:

ws.preSharedKey = "\""+ networkPass +"\"";

对于开放网络,您需要这样做:

ws.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

然后,您需要将其添加到 Android wifi 管理器设置:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
wifiManager.addNetwork(conf);

如果您需要,您可以添加此项以启用 wifi 本身(如果已经启用,则状态不会改变):

wifiManager.setWifiEnabled(true);

最后,您可能需要启用它,以便 Android 连接到它:

List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
    if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
         wifiManager.disconnect();
         wifiManager.enableNetwork(i.networkId, true);
         wifiManager.reconnect();               

         break;
    }           
 }

UPD:在 WEP 的情况下,如果您的密码是十六进制的,则不需要用引号括起来。

于 2013-07-05T18:46:50.793 回答