How to Set Proxysettings and Proxyproperties on Android Wi-Fi Connection Using Java

How can I set ProxySettings and ProxyProperties on Android Wi-Fi connection using Java?

Here's some code that should allow you to set/unset ProxyProperties. It uses some of the same code from the link above. The settings do not seem to take effect with the disconnect/reconnect.

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

Create a new WiFi connection with proxy

Well, rightly or wrongly this is how I am doing it (and it seems to work so far). To create a proxy setting, after I have created the Wifi connection I do:

            Lang.JavaSystem.SetProperty("http.proxySet", "true");
Java.Lang.JavaSystem.SetProperty("http.proxyHost", _proxyName);
Java.Lang.JavaSystem.SetProperty("http.proxyPort", _proxyPort);
Java.Lang.JavaSystem.SetProperty("http.proxyUser", _proxyUsername);
Java.Lang.JavaSystem.SetProperty("http.proxyPassword", _proxyPassword);

And when I want to clear the proxy settings I do:

            Java.Lang.JavaSystem.ClearProperty("http.proxySet");
Java.Lang.JavaSystem.ClearProperty("http.proxyHost");
Java.Lang.JavaSystem.ClearProperty("http.proxyPort");
Java.Lang.JavaSystem.ClearProperty("http.proxyUser");
Java.Lang.JavaSystem.ClearProperty("http.proxyPassword");

Wi-Fi + Proxy Configuration from Glassware

Ok, it seems to be impossible to do on the whole system, as the API that can do such thing requires a special permission and key.

So well, the proxy has to be managed per application.

How to make a proxy server on a smartphone?

I found answer behind this link. Hope it helps anybody.

How to set a static IP for new WiFi configuration?

After more than a year, I give up with setting a static IP (or DHCP, DNS, ...). Simply it's not possible, or, better, it's not allowed (from an arbitrary application).

Someone says:

"You could use NDK - this gives you low-level access to Linux under Android. Warning: don't expect this to be documented or supported. They might even ban you from Android Market (I know I would)"

For those who want to have some expriences with NDK, here is the a link:

http://developer.android.com/tools/sdk/ndk/index.html

Good luck, and give some feedback if you find something interesting!

Manual Proxy in Android through reflection

I have written below apis for proxy in android via reflection :

  /**
* This api is used for setting IP And Proxy Setting using below
* supporting methods
*
* @param wifiSetting
* @param wifiConf
*/
public static void setWifiSettings(WifiSetting wifiSetting,
WifiConfiguration wifiConf) {
// check if ip setting is static for custom ip setting
// configration
if ("STATIC".equals(wifiSetting.getIpSetting())) {
setIpSettings(wifiSetting, wifiConf);
}
// if proxy is enabled set its custom proxy settings
if (wifiSetting.getIsProxyEnabled() == true) {
setWifiProxySettings(wifiSetting, wifiConf);
}
}

/**
* This api is used for setting IP
*
* @param wifiSetting
* @param wifiConf
*/
private static void setIpSettings(WifiSetting wifiSetting,
WifiConfiguration wifiConf) {
try {
setEnumField(wifiConf, "STATIC", "ipAssignment");
setIpAddress(wifiSetting.getIpAddress(),
wifiSetting.getNetworkPrefixLength(), wifiConf);
setGateway(wifiSetting.getGateway(), wifiConf);
setDNS(wifiSetting, wifiConf);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* This api is used for setting IpAddress in wifi settings
*
* @param ipAddres
* @param prefixLength
*/
private static void setIpAddress(String ipAddress,
int networkPrefixLength, WifiConfiguration wifiConf)
throws SecurityException, IllegalArgumentException,
NoSuchFieldException, IllegalAccessException,
NoSuchMethodException, ClassNotFoundException,
InstantiationException, InvocationTargetException {
try {
if (TextUtils.isEmpty(ipAddress)) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
InetAddress inetAddr = null;
Class networkUtils = Class.forName("android.net.NetworkUtils");
Method numericToInetAddress = networkUtils.getDeclaredMethod(
"numericToInetAddress", ipAddress.getClass());
inetAddr = (InetAddress) numericToInetAddress.invoke(null,
ipAddress);
if (networkPrefixLength < 0 || networkPrefixLength > 32) {
throw new IllegalArgumentException(
"invalid networkPrefixLength parameter");
}
Object linkProperties = getFieldValue(wifiConf.getClass(),
wifiConf, "linkProperties");
if (linkProperties == null) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
Class<?> laClass = Class.forName("android.net.LinkAddress");
Constructor<?> laConstructor = laClass
.getConstructor(new Class[] { InetAddress.class,
int.class });
Object linkAddress = laConstructor.newInstance(inetAddr,
networkPrefixLength);
Class<?> setIpAddress = Class
.forName("android.net.LinkProperties");
Boolean result = (Boolean) invokeDeclaredMethod(setIpAddress,
linkProperties, "addLinkAddress",
new Class[] { laClass }, new Object[] { linkAddress });
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* This api is used for setting gateway in wifiConfigration
*
* @param gateway
* @param wifiConf
*/
private static void setGateway(String gateway,
WifiConfiguration wifiConf) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, ClassNotFoundException,
NoSuchMethodException, InstantiationException,
InvocationTargetException {
try {
if (TextUtils.isEmpty(gateway)) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
InetAddress inetAddr = null;
Class networkUtils = Class.forName("android.net.NetworkUtils");
Method numericToInetAddress = networkUtils.getDeclaredMethod(
"numericToInetAddress", gateway.getClass());
inetAddr = (InetAddress) numericToInetAddress.invoke(null,
gateway);
Object linkProperties = getFieldValue(wifiConf.getClass(),
wifiConf, "linkProperties");
if (linkProperties == null) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
Class routeInfoClass = Class.forName("android.net.RouteInfo");
Constructor routeInfoConstructor = routeInfoClass
.getConstructor(new Class[] { InetAddress.class });
Object routeInfo = routeInfoConstructor.newInstance(inetAddr);
Class<?> linkPropertiesClass = Class
.forName("android.net.LinkProperties");
Boolean result = (Boolean) invokeDeclaredMethod(
linkPropertiesClass, linkProperties, "addRoute",
new Class[] { routeInfoClass },
new Object[] { routeInfo });
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* This api is used for setting DNS in wifiConfigration
*
* @param dns
* @param wifiConf
* @throws NoSuchMethodException
* @throws InvocationTargetException
*/
private static void setDNS(WifiSetting wifiSettings,
WifiConfiguration wifiConf) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, NoSuchMethodException,
InvocationTargetException {
try {
String dns1 = wifiSettings.getDns1();
String dns2 = wifiSettings.getDns2();
if (TextUtils.isEmpty(dns1) && TextUtils.isEmpty(dns2)) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
Class dnsInfo = Class.forName("android.net.NetworkUtils");
Method setHttpProxy = dnsInfo.getDeclaredMethod(
"numericToInetAddress", String.class);
InetAddress inetAddressDns1 = (InetAddress) setHttpProxy
.invoke(null, dns1);
InetAddress inetAddressDns2 = (InetAddress) setHttpProxy
.invoke(null, dns2);
Object linkProperties = getFieldValue(wifiConf.getClass(),
wifiConf, "linkProperties");
if (linkProperties == null) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
Class<?> linkPropertiesClass = Class
.forName("android.net.LinkProperties");
Class<?> inetAddressClass = Class
.forName("java.net.InetAddress");
invokeDeclaredMethod(linkPropertiesClass, linkProperties,
"addDns", new Class[] { inetAddressClass },
new Object[] { inetAddressDns1 });
invokeDeclaredMethod(linkPropertiesClass, linkProperties,
"addDns", new Class[] { inetAddressClass },
new Object[] { inetAddressDns2 });
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* This api is used for setting Proxy in wifiConfigration
*
* @param proxyHostName
* @param proxyPort
* @param proxyExceptions
* @param config
*/
private static void setWifiProxySettings(WifiSetting wifiSettings,
WifiConfiguration config) {
try {
if (null == config) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
// get the link properties from the wifi configuration
Object linkProperties = getFieldValue(config.getClass(),
config, "linkProperties");
if (null == linkProperties) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
// 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] = wifiSettings.getProxyHostName();
proxyPropertiesCtorParams[1] = wifiSettings.getProxyPort();
proxyPropertiesCtorParams[2] = wifiSettings
.getProxyExceptions();
// 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);
setEnumField(config, "STATIC", "proxySettings");
} catch (Exception e) {
e.printStackTrace();
}
}

public static Object invokeDeclaredMethod(Class<?> clazz, Object object,
String methodName, Class<?>[] args, Object[] argsValue)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException,
InvocationTargetException, RemoteException {

LogUtil.d(TAG, "Invoking declared method " + clazz.getSimpleName()
+ "." + methodName);
Method privateMethod = clazz.getDeclaredMethod(methodName, args);
privateMethod.setAccessible(true);
Object result = privateMethod.invoke(object, argsValue);
return result;
}

private static void setEnumField(Object object, String value, String name)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field f = object.getClass().getField(name);
f.set(object, Enum.valueOf((Class<Enum>) f.getType(), value));
}

public static Object getFieldValue(Class<?> clazz, Object object,
String fieldName) {
if (clazz == null || fieldName == null) {
throw new IllegalArgumentException(
"Required argument can not be blank.");
}
Object result = null;
try {
Field f = clazz.getField(fieldName);
f.setAccessible(true);
result = f.get(object);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
return result;
}

EDIT : API FOR LOLLIPOP [the above api for proxy and ip wont work in latest Andriod L ]

 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
// Implementation for Proxy setting for LOLLIPOP
try {
URL proxyUrl = new URL(
addNetworkProxyProperties.getHttpProxyUri());
String host = proxyUrl.getHost();
int portStr = proxyUrl.getPort();
String exclusionList = addNetworkProxyProperties
.getExceptions();
Constructor<ProxyInfo> constructor = ProxyInfo.class
.getConstructor(new Class[] { String.class, int.class,
String.class });
ProxyInfo mHttpProxy = constructor.newInstance(new Object[] {
host, portStr, exclusionList });
Class ipConfigClass = Class
.forName("android.net.IpConfiguration");
Object ipConfigObject = ipConfigClass.newInstance();
Method setHttpProxy = ipConfigClass.getDeclaredMethod(
"setHttpProxy", ProxyInfo.class);
setHttpProxy.setAccessible(true);
setHttpProxy.invoke(ipConfigObject, mHttpProxy);
Method getHttpProxySettings = ipConfigClass
.getDeclaredMethod("getProxySettings");
getHttpProxySettings.setAccessible(true);
Method setProxy = config.getClass().getDeclaredMethod(
"setProxy",
getHttpProxySettings.invoke(ipConfigObject).getClass(),
ProxyInfo.class);
setProxy.setAccessible(true);
setEnumField(ipConfigObject, "STATIC", "proxySettings");
setProxy.invoke(config,
getHttpProxySettings.invoke(ipConfigObject), mHttpProxy);
} catch (Exception e) {
/*
* Excepted exceptions may be SecurityException,
* IllegalArgumentException, IllegalAccessException,
* InvocationTargetException, NoSuchMethodException,
* InstantiationException, ClassNotFoundException,
* NoSuchFieldException, MalformedURLException
*/
e.printStackTrace();
}

}

Settings.Secure.HTTP_PROXY deprecated in ICS but no information on replacement

You can use Java Reflection to set the global proxy tested on ICS.

UPDATED CODE

Activity activity = this;

private void setProxtAndPortOnICS(String porxyServer2, int port2)
{
try
{
Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge");
Class params[] = new Class[1];
params[0] = Class.forName("android.net.ProxyProperties");
Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params);

Class wv = Class.forName("android.webkit.WebView");
Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore");
Object mWebViewCoreFieldIntance = getFieldValueSafely(mWebViewCoreField, oauthPage);

Class wvc = Class.forName("android.webkit.WebViewCore");
Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame");
Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldIntance);

Class bf = Class.forName("android.webkit.BrowserFrame");
Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge");
Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame);

Class ppclass = Class.forName("android.net.ProxyProperties");
Class pparams[] = new Class[3];
pparams[0] = String.class;
pparams[1] = int.class;
pparams[2] = String.class;
Constructor ppcont = ppclass.getConstructor(pparams);

updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance("my.proxy.com", 1234, null));
}
catch (Exception ex)
{
}

}

private Object getFieldValueSafely(Field field, Object classInstance) throws IllegalArgumentException, IllegalAccessException {
boolean oldAccessibleValue = field.isAccessible();
field.setAccessible(true);
Object result = field.get(classInstance);
field.setAccessible(oldAccessibleValue);
return result;
}

NOW you can filter out the urls using proxy server.

OR look at this blog this is in Chinese but you can read the code it is fairly easy to understand.



Related Topics



Leave a reply



Submit