Come posso impostare ProxySettings e ProxyProperties sulla connessione Wi-Fi Android utilizzando Java?

Come posso impostare ProxySettings e ProxyProperties su una connessione Android Wi-Fi utilizzando Java (in modo programmato)?

Come ipAssignment, linkProperties, ProxySettings e ProxyProperties sono campi nascosti in WifiConfiguration su Android 3.1 e successivi, devo essere in grado di enum la class e utilizzare i campi.

  • Come posso invocare un metodo each 5 secondi in android?
  • Come get l'impostazione MaxLength di EditText nel codice
  • Come autenticare gli utenti dal servizio web di sharepoint 2013 e dalla directory triggers
  • Ripetizione di Alarm Manager Dopo il riavvio
  • Come get il token di aggiornamento OAuth 2 utilizzando il token di accesso
  • Rimuovi la list di articoli con Slide - Like Gmail
  • Seguendo il codice utilizzando il collegamento seguente, posso impostare un indirizzo IP statico, gateway e DNS per una connessione Wi-Fi particolare, ma devo anche impostare Wificonfiguration.ProxySettings.STATIC e ProxyProperties

    Vedere la domanda di Overflow dello stack Come configurare un indirizzo IP statico, la maschera di networking e il gateway in modo programmato su Android 3.x o 4.x.

    Per esempio,

    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, "")); 

    Alla ricerca di qualcosa di simile:

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

    Utilizzando il seguente codice da coolypf .ipAssignment .ProxySettings e linkProperties sono nascosti …

      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); 

  • Trovare i dispositivi pairing Android di Android
  • Come memorizzare Hashmap in android in modo che verrà riutilizzato quando l'applicazione riavvia utilizzando le preferenze condivise?
  • RequestIdToken di login di Google restituisce null
  • Utilizzo di Intent.ACTION_PICK per path specifico
  • Firebase e nuovo accesso Google su Android
  • Perché questi permessi vengono rifiutati?
  • 3 Solutions collect form web for “Come posso impostare ProxySettings e ProxyProperties sulla connessione Wi-Fi Android utilizzando Java?”

    Ecco un codice che dovrebbe consentire di impostare / disabilitare ProxyProperties. Utilizza lo stesso codice dal link sopra riportto. Le impostazioni non sembrano avere effetto con la disconnessione / ricollegamento.

     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) { } } 

    Ecco un codice di esempio per gestire la stessa cosa in Android 5.0 seguendo lo stesso formato della risposta di Carl sopra.

     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()); } } 

    Simile alla risposta di Dave, ma less linee usando solo il metodo setProxy(ProxySettings settings, ProxyInfo proxy) (codice circostante omesso per chiarezza):

     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); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.