android 使用代码,自动设置代理IP
2016-08-24 11:16
696 查看
1. 此例子以Android 4.2.2, API 17为基础。
2. 后面 Android 5.0.1, API 21 设置又不一样。
// 设置公共成员常量值
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));
}
// getField只能获取类的public 字段.
public static Object getFieldObject(Object obj, String name)throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Field f =
obj.getClass().getField(name);
Object out = f.get(obj); return out;
}
// 获取当前的Wifi连接
public static WifiConfiguration getCurrentWifiConfiguration(WifiManager wifiManager) {
if (!wifiManager.isWifiEnabled())
return null;
List<WifiConfiguration> configurationList = wifiManager.getConfiguredNetworks();
WifiConfiguration configuration = null;
int cur = wifiManager.getConnectionInfo().getNetworkId();
for (int i = 0; i < configurationList.size(); ++i) {
WifiConfiguration wifiConfiguration = configurationList.get(i);
if (wifiConfiguration.networkId == cur)
configuration = wifiConfiguration;
}
return configuration;
}
// API 17 可以用
// 其它可以用的版本需要再测试和处理
// @exclList 那些不走代理, 没有传null,多个数据以逗号隔开
public static void setWifiProxySettingsFor17And(Context context, String host, int port, String exclList) {
WifiManager wifiManager =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);WifiConfiguration config;
config = getCurrentWifiConfiguration(wifiManager);
if(config == null)return;
try {
//get the link properties from the wifi configuration
Object linkProperties = getFieldObject(config, "linkProperties");
if(null == linkProperties) return;
//获取类 LinkProperties的setHttpProxy方法
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);
// 获取类 ProxyProperties的构造函数
Constructor<?> proxyPropertiesCtor = proxyPropertiesClass.getConstructor(String.class,int.class, String.class);
// 实例化类ProxyProperties Object proxySettings =proxyPropertiesCtor.newInstance(host, port, exclList);
//pass the new object to setHttpProxy
Object[] params = new Object[1];
params[0] = proxySettings;
setHttpProxy.invoke(linkProperties, params);
setEnumField(config, "STATIC", "proxySettings");
//save the settings
wifiManager.updateNetwork(config);
wifiManager.disconnect();
wifiManager.reconnect();
} catch(Exception e) { }
}
// 取消代理设置
public static void unsetWifiProxySettingsFor17And(Context context) {
WifiManager wifiManager =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);WifiConfiguration config; config
= getCurrentWifiConfiguration(wifiManager);
if(null == config) return;
try {
//get the link properties from the wifi configuration
Object linkProperties = getFieldObject(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);
setEnumField(config, "NONE", "proxySettings");
//save the config
wifiManager.updateNetwork(config);
wifiManager.disconnect();
wifiManager.reconnect();
} catch(Exception e) {
}
}
// 如何调用上面的函数呢?下面示例:
// 调用设置代理:
PaNetworkUtils.setWifiProxySettingsFor17And(this, "192.168.1.142", 8888, null);
// 调用取消代理:
PaNetworkUtils.unsetWifiProxySettingsFor17And(this);
2. 后面 Android 5.0.1, API 21 设置又不一样。
// 设置公共成员常量值
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));
}
// getField只能获取类的public 字段.
public static Object getFieldObject(Object obj, String name)throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Field f =
obj.getClass().getField(name);
Object out = f.get(obj); return out;
}
// 获取当前的Wifi连接
public static WifiConfiguration getCurrentWifiConfiguration(WifiManager wifiManager) {
if (!wifiManager.isWifiEnabled())
return null;
List<WifiConfiguration> configurationList = wifiManager.getConfiguredNetworks();
WifiConfiguration configuration = null;
int cur = wifiManager.getConnectionInfo().getNetworkId();
for (int i = 0; i < configurationList.size(); ++i) {
WifiConfiguration wifiConfiguration = configurationList.get(i);
if (wifiConfiguration.networkId == cur)
configuration = wifiConfiguration;
}
return configuration;
}
// API 17 可以用
// 其它可以用的版本需要再测试和处理
// @exclList 那些不走代理, 没有传null,多个数据以逗号隔开
public static void setWifiProxySettingsFor17And(Context context, String host, int port, String exclList) {
WifiManager wifiManager =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);WifiConfiguration config;
config = getCurrentWifiConfiguration(wifiManager);
if(config == null)return;
try {
//get the link properties from the wifi configuration
Object linkProperties = getFieldObject(config, "linkProperties");
if(null == linkProperties) return;
//获取类 LinkProperties的setHttpProxy方法
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);
// 获取类 ProxyProperties的构造函数
Constructor<?> proxyPropertiesCtor = proxyPropertiesClass.getConstructor(String.class,int.class, String.class);
// 实例化类ProxyProperties Object proxySettings =proxyPropertiesCtor.newInstance(host, port, exclList);
//pass the new object to setHttpProxy
Object[] params = new Object[1];
params[0] = proxySettings;
setHttpProxy.invoke(linkProperties, params);
setEnumField(config, "STATIC", "proxySettings");
//save the settings
wifiManager.updateNetwork(config);
wifiManager.disconnect();
wifiManager.reconnect();
} catch(Exception e) { }
}
// 取消代理设置
public static void unsetWifiProxySettingsFor17And(Context context) {
WifiManager wifiManager =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);WifiConfiguration config; config
= getCurrentWifiConfiguration(wifiManager);
if(null == config) return;
try {
//get the link properties from the wifi configuration
Object linkProperties = getFieldObject(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);
setEnumField(config, "NONE", "proxySettings");
//save the config
wifiManager.updateNetwork(config);
wifiManager.disconnect();
wifiManager.reconnect();
} catch(Exception e) {
}
}
// 如何调用上面的函数呢?下面示例:
// 调用设置代理:
PaNetworkUtils.setWifiProxySettingsFor17And(this, "192.168.1.142", 8888, null);
// 调用取消代理:
PaNetworkUtils.unsetWifiProxySettingsFor17And(this);
相关文章推荐
- Android--Android Studio使用技巧--设置代码自动换行
- 使用bat批处理脚本自动设置IP和IE代理
- WebBrowser代理设置,可以根据IP,线程ID等设置代理,实现了多WebBrowser同时使用不同代理
- Android 在Java代码中设置style属性--使用代码创建ProgressBar对象(反射机制)
- Android 在Java代码中设置style属性--使用代码创建ProgressBar对象
- Android Eclipse代码自动补全设置
- android wifi 如何用代码设置代理
- 批处理、VBS实现自动设置IP、默认网关、DNS、WINS、IE代理!(二)
- 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图&设置自适应屏幕
- Android 在Java代码中设置style属性--使用代码创建ProgressBar对象
- 设置Android设备为自动获取IP
- 使用脚本自动修改ip设置
- 批处理、VBS实现自动设置IP、默认网关、DNS、WINS、IE代理!
- Android ndk windows下使用环境设置与编程实例:由.java自动生成xxx.h
- Internet Explorer® 8 之后,您可使用自动代理和自动检测功能,全局更改一些浏览器设置,而无需更改每个用户的计算机
- 自动切换IE代理设置: 简单使用IE自动配置脚本
- 批处理、VBS实现自动设置IP、默认网关、DNS、WINS、IE代理!(一)
- 自动切换IE代理设置: 简单使用IE自动配置脚本
- Android Eclipse代码自动补全设置
- 使用xml及java代码混合的方式来设置图形界面 分类: H1_ANDROID 2013-10-26 17:33 1859人阅读 评论(0) 收藏