【问题标题】:How to Set SOCKS proxy for webview如何为 webview 设置 SOCKS 代理
【发布时间】:2016-12-12 19:11:49
【问题描述】:

我需要设置 webview 以使用 SOCKS 代理。从现在开始,我一直在研究这个问题。我看到 webview 没有提供设置代理的公共接口。已经有使用Java反射设置http代理的例子了。

如此处所述:

WebView android proxy

但是这个讨论是关于设置 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 客户端请求也是如此。 但是关于身份验证方法的信息在哪里?

谁能帮我为 webview 设置 SOCKS 代理

【问题讨论】:

  • 在 Android 12 中,receiverMap 不再是 ArrayMap,而是 Android.Runtime.JavaDictionary。正如下面提到的@Jeff-gehlbach,它在 Intents extra 中缺少 ProxyInfo,但除此之外它对我有用。感谢您提供正确的系统属性。我错过了这些。

标签: android webview proxy socks


【解决方案1】:

我在追查与 HTTP 代理相关的另一个问题时遇到了这篇文章。我无法提供任何特定于 SOCKS 的帮助,但您得到的 NullPointerException 是我必须解决的问题。

您需要在包含 android.net.ProxyInfo 对象的 Intent 中设置一个名为“proxy”的额外名称,您可以使用以下静态方法构建它:

https://developer.android.com/reference/android/net/ProxyInfo.html#buildDirectProxy(java.lang.String,%20int)

您应该能够在以下拉取请求中调整代码更改 - 我不知道这对于 SOCKS 案例会如何改变,但希望它有用:

https://github.com/velazcod/Tinfoil-Facebook/pull/95/files

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2018-12-06
      • 2020-02-23
      相关资源
      最近更新 更多