Я использовал этот код для изменения настройки Ip Ip (Ip-адрес и шлюз)
вы можете увидеть полный код здесь: полный класс
WifiConfiguration wifiConf = null;
WifiManager manager = (WifiManager) getSystemService(MainActivity.WIFI_SERVICE);
WifiInfo connectionInfo = manager.getConnectionInfo();
List<WifiConfiguration> configuredNetworks = manager
.getConfiguredNetworks();
wifiConf = GetCurrentWifiConfiguration(manager);
setIpAssignment("STATIC", wifiConf);
setIpAddress(InetAddress.getByName("192.2.2.2"), 24, wifiConf);
setGateway(InetAddress.getByName("192.2.2.22"), wifiConf);
manager.updateNetwork(wifiConf);
manager.saveConfiguration();
функции:
public static void setIpAssignment(String assign , WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException{
setEnumField(wifiConf, assign, "ipAssignment");
}
public static void setIpAddress(InetAddress addr, int prefixLength, WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException,
NoSuchMethodException, ClassNotFoundException, InstantiationException, InvocationTargetException{
Object linkProperties = getField(wifiConf, "linkProperties");
if(linkProperties == null)return;
Class laClass = Class.forName("android.net.LinkAddress");
Constructor laConstructor = laClass.getConstructor(new Class[]{InetAddress.class, int.class});
Object linkAddress = laConstructor.newInstance(addr, prefixLength);
ArrayList mLinkAddresses = (ArrayList)getDeclaredField(linkProperties, "mLinkAddresses");
mLinkAddresses.clear();
mLinkAddresses.add(linkAddress);
}
public static void setGateway(InetAddress gateway, WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException,
ClassNotFoundException, NoSuchMethodException, InstantiationException, InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if(linkProperties == null)return;
Class routeInfoClass = Class.forName("android.net.RouteInfo");
Constructor routeInfoConstructor = routeInfoClass.getConstructor(new Class[]{InetAddress.class});
Object routeInfo = routeInfoConstructor.newInstance(gateway);
ArrayList mRoutes = (ArrayList)getDeclaredField(linkProperties, "mRoutes");
mRoutes.clear();
mRoutes.add(routeInfo);
}
проблема здесь:
эти коды успешно изменяют IP-адрес и шлюз, когда вы проверяете опцию Wi-Fi для подключения к вашему устройству Android, но настройка на самом деле не установлена !!!
как я понимаю это:
сначала я установил фальшивый IP-адрес и шлюз вручную, изменив опцию network- > advanced. а затем попытайтесь открыть веб-сайт с хромом, без доступа в Интернет, и он сработал. затем я установил один и тот же адрес Ip и шлюз для подключения ssid из кода, но он не работал и все еще имеет доступ в Интернет.
Я использовал те же настройки из кода и вручную, но не работал с кодом. где я ошибся?
mWifiManager.updateNetwork(selectWIfiConfi);
mWifiManager.saveConfiguration();
mWifiManager.setWifiEnabled(false);
mWifiManager.setWifiEnabled(true);
Я снова открываю Wi-Fi и работает версия телефона 4.2.2
Добавление любого количества дубликатов SSID возможно, если у вас есть уникальный IP-адрес.
В условиях неспециалиста SSID - это всего лишь идентификация данной конкретной сети, предназначенная для того, чтобы отличить эту сеть от других для простоты. Что определяет, что это IP-адрес. Если у вас есть конфликт между IP-адресом, это может быть реальной проблемой.
Для некоторых устройств (например, Samsung) вам необходимо проверить на "Показать открытое сетевое подключение", если оно доступно для просмотра открытых подключений и для некоторых устройств, которые он показывает по умолчанию.
Пример: -Позвольте сказать, что у вас две сети с SSID в качестве теста. Test1 имеет открытое соединение, доступное для общего пользования, а Test2 предназначен для личного использования и шифруется. Ваше мобильное устройство просто подключится к сети, уровень сигнала которой хорош. Поскольку IP-адрес отличается, конфликта не будет, и вы можете выполнять просмотр.
В случае возникновения конфликта (тот же уровень сигнала) устройство попросит пользователя выбрать нужную сеть или выполнить поиск новой сети.
Предостережение: -Бонирование открытой сети по причинам, связанным с финансированием, приводит к серьезным угрозам безопасности на ваш страх и риск.
IP-адрес выполняет две основные функции: идентификацию хоста или сетевого интерфейса и адресацию адресов. Его роль была охарактеризована следующим образом: "Имя указывает, что мы ищем. Адрес указывает, где он находится. Маршрут указывает, как туда добраться.
Самое простое определение IP-адреса, которое я мог бы дать, -
IP-адрес действует как домашний адрес, на который должна быть отправлена отправка. Если у вас есть два одинаковых адреса, то кому будет доставлен груз. Для получения дополнительной информации о IP читайте this
Теперь в основном мой ответ на ваш вопрос:
Вы можете демонстративно добавить несколько параметров с помощью ssid, но другой уровень безопасности
МАЛЕНЬКАЯ ДЕМО, ПОДГОТОВЛЕННАЯ:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectToAP("12345", "12345");
WifiConfiguration wifiConf = null;
WifiManager wifiManager = (WifiManager) getSystemService(MainActivity.WIFI_SERVICE);
WifiInfo connectionInfo = wifiManager.getConnectionInfo();
List<WifiConfiguration> configuredNetworks = wifiManager
.getConfiguredNetworks();
for (WifiConfiguration conf : configuredNetworks) {
if (conf.networkId == 9) {
wifiConf = conf;
setWifiProxySettings(wifiConf);
try {
setIpAssignment("STATIC", wifiConf); // or "DHCP" for
// dynamic setting
setIpAddress(InetAddress.getByName("192.168.0.100"), 24,
wifiConf);
setGateway(InetAddress.getByName("4.4.4.4"), wifiConf);
setDNS(InetAddress.getByName("4.4.4.4"), wifiConf);
wifiManager.updateNetwork(wifiConf); // apply the setting
wifiManager.saveConfiguration(); // Save it
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
public static void setIpAssignment(String assign, WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException,
NoSuchFieldException, IllegalAccessException {
setEnumField(wifiConf, assign, "ipAssignment");
}
public static void setEnumField(Object obj, String value, String name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
}
public static void setIpAddress(InetAddress addr, int prefixLength,
WifiConfiguration wifiConf) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, NoSuchMethodException,
ClassNotFoundException, InstantiationException,
InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class laClass = Class.forName("android.net.LinkAddress");
Constructor laConstructor = laClass.getConstructor(new Class[] {
InetAddress.class, int.class });
Object linkAddress = laConstructor.newInstance(addr, prefixLength);
ArrayList mLinkAddresses = (ArrayList) getDeclaredField(linkProperties,
"mLinkAddresses");
mLinkAddresses.clear();
mLinkAddresses.add(linkAddress);
}
public static void setGateway(InetAddress gateway,
WifiConfiguration wifiConf) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, ClassNotFoundException,
NoSuchMethodException, InstantiationException,
InvocationTargetException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
Class routeInfoClass = Class.forName("android.net.RouteInfo");
Constructor routeInfoConstructor = routeInfoClass
.getConstructor(new Class[] { InetAddress.class });
Object routeInfo = routeInfoConstructor.newInstance(gateway);
ArrayList mRoutes = (ArrayList) getDeclaredField(linkProperties,
"mRoutes");
mRoutes.clear();
mRoutes.add(routeInfo);
}
public static void setDNS(InetAddress dns, WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException,
NoSuchFieldException, IllegalAccessException {
Object linkProperties = getField(wifiConf, "linkProperties");
if (linkProperties == null)
return;
ArrayList<InetAddress> mDnses = (ArrayList<InetAddress>) getDeclaredField(
linkProperties, "mDnses");
mDnses.clear(); // or add a new dns address , here I just want to
// replace DNS1
mDnses.add(dns);
}
public static Object getField(Object obj, String name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getField(name);
Object out = f.get(obj);
return out;
}
public static Object getDeclaredField(Object obj, String name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = obj.getClass().getDeclaredField(name);
f.setAccessible(true);
Object out = f.get(obj);
return out;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
String TAG = "wifi";
WifiManager wifiManager;
public void connectToAP(String ssid, String passkey) {
Log.i(TAG, "* connectToAP");
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiConfiguration wifiConfiguration = new WifiConfiguration();
String networkSSID = ssid;
String networkPass = passkey;
Log.d(TAG, "# password " + networkPass);
// for (ScanResult result : scanResultList) {
// if (result.SSID.equals(networkSSID)) {
if (true) {
// String securityMode = getScanResultSecurity(result);
String securityMode = "OPEN";
if (securityMode.equalsIgnoreCase("OPEN")) {
wifiConfiguration.SSID = "\"" + networkSSID + "\"";
wifiConfiguration.allowedKeyManagement
.set(WifiConfiguration.KeyMgmt.NONE);
int res = wifiManager.addNetwork(wifiConfiguration);
Log.d(TAG, "# add Network returned " + res);
boolean b = wifiManager.enableNetwork(res, true);
Log.d(TAG, "# enableNetwork returned " + b);
wifiManager.setWifiEnabled(true);
} else if (securityMode.equalsIgnoreCase("WEP")) {
wifiConfiguration.SSID = "\"" + networkSSID + "\"";
wifiConfiguration.wepKeys[0] = "\"" + networkPass + "\"";
wifiConfiguration.wepTxKeyIndex = 0;
wifiConfiguration.allowedKeyManagement
.set(WifiConfiguration.KeyMgmt.NONE);
wifiConfiguration.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP40);
int res = wifiManager.addNetwork(wifiConfiguration);
Log.d(TAG, "### 1 ### add Network returned " + res);
boolean b = wifiManager.enableNetwork(res, true);
Log.d(TAG, "# enableNetwork returned " + b);
wifiManager.setWifiEnabled(true);
}
wifiConfiguration.SSID = "\"" + networkSSID + "\"";
wifiConfiguration.preSharedKey = "\"" + networkPass + "\"";
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
wifiConfiguration.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.TKIP);
wifiConfiguration.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.CCMP);
wifiConfiguration.allowedKeyManagement
.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wifiConfiguration.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
wifiConfiguration.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
wifiConfiguration.allowedProtocols
.set(WifiConfiguration.Protocol.RSN);
wifiConfiguration.allowedProtocols
.set(WifiConfiguration.Protocol.WPA);
int res = wifiManager.addNetwork(wifiConfiguration);
Log.d(TAG, "### 2 ### add Network returned " + res);
wifiManager.enableNetwork(res, true);
boolean changeHappen = wifiManager.saveConfiguration();
if (res != -1 && changeHappen) {
Log.d(TAG, "### Change happen");
// AppStaticVar.connectedSsidName = networkSSID;
} else {
Log.d(TAG, "*** Change NOT happen");
}
wifiManager.setWifiEnabled(true);
}
// }
}
public String getScanResultSecurity(ScanResult scanResult) {
Log.i(TAG, "* getScanResultSecurity");
final String cap = scanResult.capabilities;
final String[] securityModes = { "WEP", "PSK", "EAP" };
for (int i = securityModes.length - 1; i >= 0; i--) {
if (cap.contains(securityModes[i])) {
return securityModes[i];
}
}
return "OPEN";
}
/* PROXY SETTINGS */
/*********************************************************************/
// public static Object getField(Object obj, String name)
// throws SecurityException, NoSuchFieldException,
// IllegalArgumentException, IllegalAccessException {
// Field f = obj.getClass().getField(name);
// Object out = f.get(obj);
// return out;
// }
//
// public static Object getDeclaredField(Object obj, String name)
// throws SecurityException, NoSuchFieldException,
// IllegalArgumentException, IllegalAccessException {
// Field f = obj.getClass().getDeclaredField(name);
// f.setAccessible(true);
// Object out = f.get(obj);
// return out;
// }
//
// public static void setEnumField(Object obj, String value, String name)
// throws SecurityException, NoSuchFieldException,
// IllegalArgumentException, IllegalAccessException {
// Field f = obj.getClass().getField(name);
// f.set(obj, Enum.valueOf((Class<Enum>) f.getType(), value));
// }
public static void setProxySettings(String assign,
WifiConfiguration wifiConf) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException {
setEnumField(wifiConf, assign, "proxySettings");
}
WifiConfiguration GetCurrentWifiConfiguration(WifiManager manager) {
if (!manager.isWifiEnabled())
return null;
List<WifiConfiguration> configurationList = manager
.getConfiguredNetworks();
WifiConfiguration configuration = null;
int cur = manager.getConnectionInfo().getNetworkId();
for (int i = 0; i < configurationList.size(); ++i) {
WifiConfiguration wifiConfiguration = configurationList.get(i);
if (wifiConfiguration.networkId == cur)
configuration = wifiConfiguration;
}
return configuration;
}
void setWifiProxySettings(WifiConfiguration config) {
if (null == config)
return;
try {
Object linkProperties = getField(config, "linkProperties");
if (null == linkProperties)
return;
Class proxyPropertiesClass = Class
.forName("android.net.ProxyProperties");
Class[] setHttpProxyParams = new Class[1];
setHttpProxyParams[0] = proxyPropertiesClass;
Class lpClass = Class.forName("android.net.LinkProperties");
Method setHttpProxy = lpClass.getDeclaredMethod("setHttpProxy",
setHttpProxyParams);
setHttpProxy.setAccessible(true);
// get ProxyProperties constructor
Class[] proxyPropertiesCtorParamTypes = new Class[3];
proxyPropertiesCtorParamTypes[0] = String.class;
proxyPropertiesCtorParamTypes[1] = int.class;
proxyPropertiesCtorParamTypes[2] = String.class;
Constructor proxyPropertiesCtor = proxyPropertiesClass
.getConstructor(proxyPropertiesCtorParamTypes);
// create the parameters for the constructor
Object[] proxyPropertiesCtorParams = new Object[3];
proxyPropertiesCtorParams[0] = "127.0.0.1";
proxyPropertiesCtorParams[1] = 8118;
proxyPropertiesCtorParams[2] = "example.com";
// create a new object using the params
Object proxySettings = proxyPropertiesCtor
.newInstance(proxyPropertiesCtorParams);
// pass the new object to setHttpProxy
Object[] params = new Object[1];
params[0] = proxySettings;
setHttpProxy.invoke(linkProperties, params);
setProxySettings("STATIC", config);
} catch (Exception e) {
}
}
void unsetWifiProxySettings() {
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration config = GetCurrentWifiConfiguration(manager);
if (null == config)
return;
try {
// get the link properties from the wifi configuration
Object linkProperties = getField(config, "linkProperties");
if (null == linkProperties)
return;
// get the setHttpProxy method for LinkProperties
Class proxyPropertiesClass = Class
.forName("android.net.ProxyProperties");
Class[] setHttpProxyParams = new Class[1];
setHttpProxyParams[0] = proxyPropertiesClass;
Class lpClass = Class.forName("android.net.LinkProperties");
Method setHttpProxy = lpClass.getDeclaredMethod("setHttpProxy",
setHttpProxyParams);
setHttpProxy.setAccessible(true);
// pass null as the proxy
Object[] params = new Object[1];
params[0] = null;
setHttpProxy.invoke(linkProperties, params);
setProxySettings("NONE", config);
// save the config
manager.updateNetwork(config);
manager.disconnect();
manager.reconnect();
} catch (Exception e) {
}
}
}
ЗДЕСЬ В ВЫШЕМ КОДЕ ПОПРОБУЙТЕ ИСПОЛЬЗОВАТЬ СВОЙ КОД С:
String securityMode = "OPEN";
String securityMode = "WEP";
один раз за раз:
НАБЛЮДЕНИЕ: ОБА УСТАНОВКИ ПОЛУЧЕНЫ ПРОГРАММАМИ, НО МОЖЕТ БЫТЬ УВИДЕТЬ ТОЛЬКО ОДИН РАЗ, КАК ОБА ОБОГАЩАЕТСЯ С КАКОЙ-ЛИБО ДРУГОЙ.. И БЫТЬ НАСТОЯЩИМ. теперь вопрос в том, как я знаю, что оба присутствуют? 1. Запустите код выше. 2. один раз с OPEN в качестве уровня безопасности и один раз с WEP 3. после добавления вкладки wifi и есть возможность забыть сеть. 4. Вы будете наблюдать, что, хотя вы удалили его, он все еще там:) 5. Следовательно, оба параметра существуют, но программно программно перекрываются.
МОЙ АНАЛИЗ С HOTSPOT:
Я включил 2 устройства в качестве точки доступа с одним и тем же ssid, но с другим уровнем безопасности, и я вижу два отдельных Wi-Fi, но дело в том, что при добавлении программно он остается там, но перекрывается.
ПРИМЕЧАНИЕ. ДОБАВЛЕНИЕ ВНЕШНЕГО ИЛИ ПРОГРАММНО-ТАМИЧЕСКОГО ИСПОЛЬЗОВАНИЯ УСТАНОВКИ WIFI ПОЛНОСТЬЮ НАРУШИТСЯ СУЩЕСТВУЮЩИМ ОДНОМУ, НО ДАЖЕ С ДЕЙСТВИТЕЛЬНЫМ РАЗНООБРАЗИЕМ РАБОТЫ.
Как я вижу, вы смогли изменить настройки и получить значения, измененные в представлении настроек, но фактического изменения состояния системы на устройстве не произошло.
У вас наиболее вероятно нет привилегий для изменения настроек Wi-Fi в вашей программе.
Попробуйте добавить следующее:
ACCESS_WIFI_STATE
CHANGE_WIFI_STATE
ACCESS_NETWORK_STATE
См. мои комментарии к вопросу для получения дополнительной информации.