设置Android WebView的代理

问题描述

我一直在尝试设置代理并从android Webview中使用,但是在加载网站时始终返回net::error_timed_out

我已经使用NetCipher并使用了正常的System.setProperty(“ http.proxyHost”,ip);方法,它始终返回True“表示已成功连接”,但是当我尝试运行webView.loadUrl(link);时,它返回net::error_timed_out,有时我尝试加载的链接成功加载

我使用的功能

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private boolean setProxy(String host,String port) {
    Log.d("Debug","Setting proxy with >= 4.4 API.");
    Context appContext = webView.getContext().getApplicationContext();
    System.setProperty("http.proxyHost",host);
    System.setProperty("http.proxyPort",port + "");
    System.setProperty("https.proxyHost",host);
    System.setProperty("https.proxyPort",port + "");
    try {
        Field loadedApkField = appContext.getClass().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("Debug","Setting proxy with >= 4.4 API successful!");
        return true;
    } catch (NoSuchMethodException e) {
        e.printstacktrace();
        return false;
    } catch (InvocationTargetException e) {
        e.printstacktrace();
        return false;
    } catch (NoSuchFieldException e) {
        e.printstacktrace();
        return false;
    } catch (illegalaccessexception e) {
        e.printstacktrace();
        return false;
    } catch (ClassNotFoundException e) {
        e.printstacktrace();
        return false;
    }
}

连接功能

     WebViewActivity.this.runOnUiThread(new Runnable() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void run() {
                try {
//                    boolean worked = WebkitProxy.setProxy(MainActivity.class.getName(),getApplicationContext(),webView,proxyDomain,Integer.parseInt(proxyPort));
                    boolean worked = setProxy(proxyIP,proxyPort);
                    Log.d("Debug","IP = "+proxyIP+" ProxyPort = "+proxyPort + " worked= "+worked);
                    webView.setWebChromeClient(new WebChromeClient());
                    webView.clearCache(true);
                   webView.clearHistory();
                    webView.getSettings().setJavaScriptEnabled(true);
                    webView.getSettings().setJavaScriptCanopenWindowsAutomatically(true);
                    webView.loadUrl(link);
                } catch (Exception e) {
                    Log.d("Debug","Could not start WebkitProxy " + e.getMessage() + " Number : "+number);
                }

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.xxx">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".WebViewActivity"></activity>
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)