我需要将webview设置为使用SOCKS代理。我几天来一直在研究这个问题。我看到webview没有提供设置PROXY的公共界面。有些例子使用Java反射来设置http代理。
如下所述:
但是这个讨论是关于设置http / https代理。
为了设置socks代理,我使用了以下方法:
private static boolean setProxyKKPlus(WebView webView, String host, int port) {
Log.d(TAG, "Setting proxy with >= 4.4 API.");
Context appContext = webView.getContext().getApplicationContext();
String user = NativeSDK.getProxyUser();
String pass = NativeSDK.getProxyPass();
System.setProperty("socksProxyHost", host);
System.setProperty("socksProxyPort", port + "");
System.setProperty("java.net.socks.username", user);
System.setProperty("java.net.socks.password", pass);
Log.d(TAG,"socks proxy set");
try{
Class applictionCls = Class.forName("android.app.Application");
Field loadedApkField = applictionCls.getField("mLoadedApk");
loadedApkField.setAccessible(true);
Object loadedApk = loadedApkField.get(appContext);
Class loadedApkCls = Class.forName("android.app.LoadedApk");
Field receiversField = loadedApkCls.getDeclaredField("mReceivers");
receiversField.setAccessible(true);
ArrayMap receivers = (ArrayMap) receiversField.get(loadedApk);
for (Object receiverMap : receivers.values()) {
for (Object rec : ((ArrayMap) receiverMap).keySet()) {
Class clazz = rec.getClass();
if (clazz.getName().contains("ProxyChangeListener")) {
Method onReceiveMethod = clazz.getDeclaredMethod("onReceive", Context.class, Intent.class);
Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
onReceiveMethod.invoke(rec, appContext, intent);
}
}
}
Log.d(TAG, "Setting proxy with >= 4.4 API successful!");
return true;
}
catch (all exceptions) {
Log.d(TAG, "Setting proxy with >= 4.4 API NOT successful!");
return false;
}
但这似乎并没有真正起作用: 我在来自ProxyChangeListener的日志中收到此错误:
E/ProxyChangeListener: Using no proxy configuration due to exception:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
现在奇怪的部分是:在我在webview中输入url之后的代码,请求由上面端口上的套接字读取 - 代理端口。 (我相信这表明请求正在被代理)但是我从套接字读取的请求看起来像:\ x05 \ x01
据我了解:(来自wiki)
来自客户的初始问候是
字段1:SOCKS版本号(此版本必须为0x05) 字段2:支持的认证方法的数量,1个字节 字段3:认证方法,可变长度,每种方法支持1字节
这是SOCKS5客户端请求。 但那么有关身份验证方法的信息在哪里?
有人可以帮我设置网页浏览的SOCKS代理吗
答案 0 :(得分:0)
我在追查与HTTP代理相关的其他问题的同时遇到了这篇文章。我不能提供任何SOCKS特定的帮助,但是你得到的NullPointerException是我必须要解决的问题。
你需要设置一个额外命名的"代理"在包含android.net.ProxyInfo对象的intent中,您可以使用以下静态方法构建它:
您应该能够在以下拉取请求中调整代码更改 - 我再也不知道SOCKS案例会如何改变,但希望它有用:
答案 1 :(得分:0)
我认为最成熟的解决方案是Guardianproject / NetCipher / sample-webviewclient: