我正在开发一个通过网络连接到自定义硬件的 Android 应用程序。
如果您将其设置为使用无线接入点,则可以正常工作。如果您将其设置为使用设备上的接入点(也称为网络共享),它可以正常工作。如果您将其设置为使用 ad-hoc 网络,则它不起作用。Android 在“获取 IP 地址”步骤失败。
我们的解决方法是使用静态 IP 地址,而且效果非常好!如果您将平板电脑连接到我们的自定义硬件并强制使用自定义子网掩码和 IP 地址,它会立即连接。
然而,这太令人费解了。DHCP 或 GTFO。我们的解决方案使用自定义网络管理器,如果它是 ad-hoc 网络,则自动强制使用静态 IP 地址。这应该有效。
我已按照此链接上的说明进行操作(进行了一些修改),并且效果非常好。您可以选择网络,为其分配静态 IP 地址,仅此而已。安卓平板电脑永远不会连接到网络。但是,如果您查看“真实”wifi管理器下的网络并选择“修改设置”,您可以看到所有静态IP地址信息都保存在哪里。它只是不会连接。
更让我痛苦的是,如果您删除网络,然后转到 android wifi 管理器并手动输入信息,它就可以工作。但如果您以编程方式执行相同的步骤,则不会。
有谁知道这是为什么,或者如何解决?这是在根节点 7 上。
提前致谢。
public void connectToWiFiNetwork(String networkSSID, String networkPass, String type)
{
//Make sure a password is set
if(networkPass != null && networkPass.length() == 0)
return;
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\""; // Please note the quotes. String should contain ssid in quotes
conf.status = WifiConfiguration.Status.ENABLED;
int id = -1;
if(type.contains("WPA")) {
conf.preSharedKey = "\""+ networkPass +"\"";
//conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
System.out.println("Contains WPA");
} else if (type.contains("WEP")) {
conf.wepKeys[0] = "\"" + networkPass + "\"";
conf.wepTxKeyIndex = 0;
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
System.out.println("Contains WEP");
} else {
//open network?
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
System.out.println("Open WiFi");
}
if(type.contains("IBSS"))
{
//Adhoc network. Provide an IP address to prevent... stuff.
//For Android 2.x
//final ContentResolver cr = this.context.getContentResolver();
//Settings.System.putInt(cr, Settings.System.WIFI_USE_STATIC_IP, 1);
//Settings.System.putString(cr, Settings.System.WIFI_STATIC_IP, "169.254.1.1");
//Settings.System.putString(cr, Settings.System.WIFI_STATIC_NETMASK, "255.255.0.0");
try{
//Some code here isn't used...
WifiConfiguration wifiConf = null;
WifiManager wifiManager = (WifiManager)this.context.getSystemService(Context.WIFI_SERVICE);
WifiInfo connectionInfo = wifiManager.getConnectionInfo();
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
for (WifiConfiguration conf2 : configuredNetworks){
if (conf2.networkId == connectionInfo.getNetworkId()){
wifiConf = conf2;
break;
}
}
wifiConf = conf;
setIpAssignment("STATIC", wifiConf); //or "DHCP" for dynamic setting
Log.d("CONNECTION", "Connecting now using a static IP address");
setIpAddress(InetAddress.getByName("169.254.1.1"), 24, wifiConf);
Log.d("CONNECTION", "Connecting now using a static IP address");
setGateway(InetAddress.getByName("255.255.0.0"), wifiConf);
Log.d("CONNECTION", "Connecting now using a static IP address");
setDNS(InetAddress.getByName("8.8.8.8"), wifiConf);
Log.d("CONNECTION", "Connecting now using a static IP address");
//wifiManager.updateNetwork(wifiConf); //apply the setting
Log.d("CONNECTION", "Connecting now using a static IP address");
}catch(Exception e){
e.printStackTrace();
}
}
id = wifi.addNetwork(conf);
wifi.saveConfiguration();
//Add the network
//And enable it
List<WifiConfiguration> list = wifi.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
wifi.disconnect();
wifi.enableNetwork(i.networkId, true);
wifi.reconnect();
break;
}
}
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("auto_start_tethering", false);
editor.commit();
Log.d("CONNECTION", "Connecting using " + networkSSID + " and " + networkPass + ".");
}