如何解决设置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 举报,一经查实,本站将立刻删除。