- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写一个 android 应用程序,它将连接到特定的 WPA 接入点,连接后,它将发出一个 http 调用。它不会保存网络配置。我已经阅读了几乎所有关于连接到 wifi 网络的堆栈溢出的帖子,但找不到适合我的答案。这是我用来连接的代码..
WifiConfiguration wc = new WifiConfiguration();
wc.allowedAuthAlgorithms.clear();
wc.allowedGroupCiphers.clear();
wc.allowedPairwiseCiphers.clear();
wc.allowedProtocols.clear();
wc.allowedKeyManagement.clear();
wc.SSID = "\"".concat("<ssid>").concat("\"");
wc.preSharedKey = "\"".concat("<password>").concat("\"");
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
wc.priority = 0;
//wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;
// connect to and enable the connection
WifiManager wifiManager = (WifiManager) getSystemService(this.WIFI_SERVICE);
int netId = wifiManager.addNetwork(wc);
boolean wifiEnabled = wifiManager.enableNetwork(netId, true);
wifiManager.setWifiEnabled(true);
Log.d("opener", "addNetwork returned " + netId);
if (netId > 0) {
wifiId = netId;
}
但是 netId 始终为 -1。我已经在两款不同的手机(ICS:HTC Rezound 和 GingerBread:Motorola DroidX)上进行了尝试。两者都显示完全相同的结果。我做错了什么?
编辑:我用 WPA2 接入点尝试了相同的代码,得到了非常奇怪的结果。运行此代码时,第一次它会返回 -1,但如果我第二次调用相同的方法并延迟 1 秒,它将返回有效的 netId。所以问题是
最佳答案
可能有点晚了,但请尝试连接到 Open/WPA/WPA2/WEP 安全网络
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = selectedNetwork.SSID();
wifiConfig.status = WifiConfiguration.Status.DISABLED;
wifiConfig.priority = 40;
// Dependent on the security type of the selected network
// we set the security settings for the configuration
if (/*Open network*/) {
// No security
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfig.allowedAuthAlgorithms.clear();
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
} else if (/*WPA*/ || /*WPA2*/) {
//WPA/WPA2 Security
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfig.preSharedKey = "\"".concat(password).concat("\"");
} else if (/*WEP*/) {
// WEP Security
wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
if (getHexKey(password)) wifiConfig.wepKeys[0] = password;
else wifiConfig.wepKeys[0] = "\"".concat(password).concat("\"");
wifiConfig.wepTxKeyIndex = 0;
}
// Finally we add the new configuration to the managed list of networks
int networkID = wifiMan.addNetwork(wifiConfig);
显然,根据适用的不同安全类型设置您自己的变量。连接到 WEP 安全网络的关键(请原谅双关语)是 getHexKey 方法,如下所示。
/**
* WEP has two kinds of password, a hex value that specifies the key or
* a character string used to generate the real hex. This checks what kind of
* password has been supplied. The checks correspond to WEP40, WEP104 & WEP232
* @param s
* @return
*/
private static boolean getHexKey(String s) {
if (s == null) {
return false;
}
int len = s.length();
if (len != 10 && len != 26 && len != 58) {
return false;
}
for (int i = 0; i < len; ++i) {
char c = s.charAt(i);
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
continue;
}
return false;
}
return true;
}
关于Android WifiManager.addNetwork() 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016918/
对于私有(private)用途,我尝试使用以下代码加载 WiFi 管理器 (iOS 6.1): airportHandle = 0; libHandle = 0; libHan
使用 Android 的 WifiManager 扫描可用的 Wifi 网络非常简单。 通过context.getSystemService获取WifiManager句柄 创建 Intent 创建广播
我正在尝试使用 WifiManager (StartScan) 类扫描一些接入点,此扫描发生在触摸事件中,但每次触摸仅进行一次扫描。问题是我需要使这个过程 10、20 或我想要的次数;但是我不知道我该
在 Android 8.1.0 及更高版本上,我遇到了一个主要问题。当使用 enableNetwork 连接到没有互联网的网络时,Android 会在几秒钟后决定将设备放回之前的网络。 我有意连接到所
我需要扫描所有可用的wifi网络,但是方法“wifiManager.startScan()”已被弃用,我找不到其他方法。 有谁知道真正的选择? 我试图在开发人员Android门户中查找更多信息,但是它
我正在搜索可用的 wifi 网络扫描,但 getScanResults() 方法返回空列表。 我包含了所需的所有权限: android.permission.ACCESS_COARSE_LOCATIO
我正在使用 ESP8266,并希望使用 MQTT 来控制它,MQTT 服务器是我的 Synology DS415+。我希望 ESP 位于安装后无法使用串行访问它的地方,因此我需要能够使用 WiFi 配
我在计时器中有这个: if (wManager.startScan()) { try { //Following method is one I call to process the r
我正在尝试连接到一个开放的 wifi 网络。当我打开我的应用程序时,它应该打开 wifi 并连接到如下定义的网络。问题是 WifiManager.getConfiguredNetworks 总是返回一
你们中有人有过 setWifiEnabled() 返回值的经验吗? 文档不清楚,它说: Returns true if the operation succeeds (or if the existi
我的问题很简单。我使用 wifiManager 扫描网络,在 SCAN_RESULTS_AVAILABLE_ACTION 广播接收器中获取结果,然后使用该信息在设备选择页面上连接到我想要连接的网络。我
我在通过代码连接到特定网络(比如 A)时遇到问题。 我的代码 fragment 是: tmpConfig = new WifiConfiguration(); tmpConfig.BSSID = sB
我正在尝试扫描多个无线信号的强度。为此,我使用 WifiManager,在循环中调用 startScan() 并且我有一个广播接收器来获取结果。 我的问题是: 我怎样才能只对某些网络进行扫描?在结果中
作为 Android 编程的新手,我尝试使用 WifiManager 的 getScanResults() 方法获取 SSID 列表,但它仍然是空的,即使我已授予它 ACCESS_COARSE_LOC
我有一台服务器,它是另一台安卓设备。服务器启动 wifi 热点。在我的客户端上,我尝试自动连接到热点。 我在 onStart() 的新线程中调用此函数: private void enableWifi
执行此行后: WifiManager man = ((WifiManager) ctx.getSystemService(Context.WIFI_SERVICE)); 将显示一个标有“WifiMan
这让我很难受,我们将不胜感激。 我想使用 wifi 管理器连接到开放网络。我遇到的问题是代码声称连接到任何网络——甚至是不存在的网络。下面是使用网络的 SSID 执行和调用的完整代码。无论您将什么字符
我正在使用自 API 级别 21 起在 WifiManager 中可用的新方法 is5GHzBandSupported()。 http://developer.android.com/referenc
在调用 WifiManager.enableNetwork() 时,我看到我的调用线程在 native 代码中挂起。到目前为止,我只能在运行 Android 3.2.1 的 Motorola Xoom
我正在 onResume() 上注册接收器: registerReceiver(wifiConnectivityReceiver, new IntentFilter(W
我是一名优秀的程序员,十分优秀!