Как установить ProxySettings и ProxyProperties на Android Wi-Fi соединение с помощью Java?

Как установить ProxySettings и ProxyProperties на Android Wi-Fi соединение с помощью Java (программно)?

Как ipAssignment, linkProperties, ProxySettings и ProxyProperties являются скрытыми полями в WifiConfiguration на Android 3.1 и выше, мне нужно перечислить класс и использовать поля.

Следуя образцу кода, используя приведенную ниже ссылку, я могу установить статический IP-адрес, шлюз и DNS для определенного Wi-Fi-соединения, но мне также нужно установить Wificonfiguration.ProxySettings.STATIC и ProxyProperties

См. Вопрос о переполнении стека. Как настроить статический IP-адрес, сетевую маску, шлюз программно на Android 3.x или 4.x.

Например,

WifiConfiguration config = new WifiConfiguration(configuration); config.ipAssignment = WifiConfiguration.IpAssignment.UNASSIGNED; config.proxySettings = WifiConfiguration.ProxySettings.STATIC; config.linkProperties.setHttpProxy(new ProxyProperties("127.0.0.1", 3128, "")); 

Ищете что-то вроде:

 setProxySettings("STATIC", wifiConf); setProxyProperties("proxyserver.mine.com.au", 8080, ""); // Set Proxy server and port. wifiManager.updateNetwork(wifiConf); //apply the setting 

Используя следующий код из coolypf .ipAssignment .ProxySettings и linkProperties скрыты …

  WifiManager manager = (WifiManager)getSystemService(Context.WIFI_SERVICE); manager.asyncConnect(this, new Handler()); if (!manager.isWifiEnabled()) return; 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; } if (configuration == null) return; WifiConfiguration config = new WifiConfiguration(configuration); config.ipAssignment = WifiConfiguration.IpAssignment.UNASSIGNED; config.proxySettings = WifiConfiguration.ProxySettings.STATIC; config.linkProperties.clear(); config.linkProperties.setHttpProxy(new ProxyProperties("127.0.0.1", 3128, "")); manager.saveNetwork(config); 

Solutions Collecting From Web of "Как установить ProxySettings и ProxyProperties на Android Wi-Fi соединение с помощью Java?"

Вот код, который должен позволить вам установить / отключить ProxyProperties. Он использует один и тот же код из приведенной выше ссылки. Настройки, похоже, не вступают в силу с отключением / повторным подключением.

 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() { //get the current wifi configuration 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); //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] = null; //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); //save the settings manager.updateNetwork(config); manager.disconnect(); manager.reconnect(); } 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) { } } 

Вот пример кода, который обрабатывает то же самое в Android 5.0 в том же формате, что и ответ Карла выше.

 public void setWifiProxySettings5() { //get the current wifi configuration WifiManager manager = (WifiManager)getSystemService(Context.WIFI_SERVICE); WifiConfiguration config = GetCurrentWifiConfiguration(manager); if(null == config) return; try { //linkProperties is no longer in WifiConfiguration Class proxyInfoClass = Class.forName("android.net.ProxyInfo"); Class[] setHttpProxyParams = new Class[1]; setHttpProxyParams[0] = proxyInfoClass; Class wifiConfigClass = Class.forName("android.net.wifi.WifiConfiguration"); Method setHttpProxy = wifiConfigClass.getDeclaredMethod("setHttpProxy", setHttpProxyParams); setHttpProxy.setAccessible(true); //Method 1 to get the ENUM ProxySettings in IpConfiguration Class ipConfigClass = Class.forName("android.net.IpConfiguration"); Field f = ipConfigClass.getField("proxySettings"); Class proxySettingsClass = f.getType(); //Method 2 to get the ENUM ProxySettings in IpConfiguration //Note the $ between the class and ENUM //Class proxySettingsClass = Class.forName("android.net.IpConfiguration$ProxySettings"); Class[] setProxySettingsParams = new Class[1]; setProxySettingsParams[0] = proxySettingsClass; Method setProxySettings = wifiConfigClass.getDeclaredMethod("setProxySettings", setProxySettingsParams); setProxySettings.setAccessible(true); ProxyInfo pi = ProxyInfo.buildDirectProxy("127.0.0.1", 8118); //Android 5 supports a PAC file //ENUM value is "PAC" //ProxyInfo pacInfo = ProxyInfo.buildPacProxy(Uri.parse("http://localhost/pac")); //pass the new object to setHttpProxy Object[] params_SetHttpProxy = new Object[1]; params_SetHttpProxy[0] = pi; setHttpProxy.invoke(config, params_SetHttpProxy); //pass the enum to setProxySettings Object[] params_setProxySettings = new Object[1]; params_setProxySettings[0] = Enum.valueOf((Class<Enum>) proxySettingsClass, "STATIC"); setProxySettings.invoke(config, params_setProxySettings); //save the settings manager.updateNetwork(config); manager.disconnect(); manager.reconnect(); } catch(Exception e) { Log.v("wifiProxy", e.toString()); } } 

Подобно ответу Дэйва, но меньше строк, используя только метод setProxy(ProxySettings settings, ProxyInfo proxy) (окружающий код опущен для ясности):

 Class proxySettings = Class.forName("android.net.IpConfiguration$ProxySettings"); Class[] setProxyParams = new Class[2]; setProxyParams[0] = proxySettings; setProxyParams[1] = ProxyInfo.class; Method setProxy = config.getClass().getDeclaredMethod("setProxy", setProxyParams); setProxy.setAccessible(true); ProxyInfo desiredProxy = ProxyInfo.buildDirectProxy(YOUR_HOST, YOUR_PORT); Object[] methodParams = new Object[2]; methodParams[0] = Enum.valueOf(proxySettings, "STATIC"); methodParams[1] = desiredProxy; setProxy.invoke(config, methodParams);