我在 Android 和 Java 上是完整的菜鸟,我使用 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项目(我的手机在2.3.6上)开发Eclipse。我是否必须包含除此处导入之外的其他文件(MainActivity.java)?
编辑:回答此this答案中的问题。 回答我的其他问题(我的网络列表附加了相应的SSID,但是当我确定它是101%时,它不在范围内,因为那是我的路由器!你知道可能有什么吗?出错了?)和wifi连接的完整方法here。
答案 0 :(得分:2)
您是否在AndroidMainfest.xml
声明了使用ACCESS_WIFI_STATE的权限?
这是Android项目的根目录。
只需打开它并将其放在应用程序标记的上方或下方
就是这样
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
答案 1 :(得分:1)
请参阅此答案以获取更多信息,我是从here
中提取的对于WEP网络,您需要这样做:
ws.wepKeys[0] = "\"" + networkPass + "\"";
ws.wepTxKeyIndex = 0;
ws.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
ws.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
对于WPA网络,您需要添加如下密码:
ws.preSharedKey = "\""+ networkPass +"\"";
对于Open network,您需要这样做:
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,如果您的密码是十六进制,则不需要用引号括起来。