我知道如何手动设置代理并在我的WebView中使用它.
设置 - >无线网络 - >移动网络 - >接入点名称 - > telkila.现在输入代理服务器地址和端口(将为80).WebView.enablePlatformNotifications();
但我可以从代码中设置代理设置吗?所以我的用户不必手动设置?
谢谢
我需要在一个国家/地区中无法使用的WebView中加载一些url,因此我尝试将代理与WebView一起使用。我在SO(/sf/answers/1291736911/)上找到了一个解决方案,它可以与无需身份验证的代理一起使用。但是我需要使用用户名和密码设置代理。
有些方法没有帮助:
1)使用标头加载网址
class ProxyAuthWebViewClient extends WebViewClient {
String proxyUserName;
String proxyPassword;
public ProxyAuthWebViewClient(String proxyUserName, String proxyPassword){
this.proxyUserName = proxyUserName;
this.proxyPassword = proxyPassword;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
loadUrl(view, url, proxyUserName, proxyPassword);
return true ;
}
}
public void loadUrl(WebView view, String url, String proxyUserName, String proxyPassword){
UsernamePasswordCredentials creds= new UsernamePasswordCredentials(proxyUserName, proxyPassword);
Header credHeader = BasicScheme.authenticate(creds, "UTF-8", true);
Map<String, String> header = new HashMap<String, String>();
header.put(credHeader.getName(), credHeader.getValue());
view.loadUrl(url, header);
}
Run Code Online (Sandbox Code Playgroud)
2)在setProxy方法中添加密码和用户(以下完整代码):
Authenticator.setDefault(
new Authenticator() …Run Code Online (Sandbox Code Playgroud) 所以这个解决方案适用于Android 4.4.4,然而,代码停止在Android-L开发人员预览上工作,有没有人有一些Android-L的工作代码?或者我自己如何获取代码的任何提示?
这是我用于KitKat的当前方法(并且有效)
@TargetApi(Build.VERSION_CODES.KITKAT)
private static boolean setKitKatWebViewProxy(WebView webView, String host, int port) {
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 {
Class applictionCls = Class.forName(FinalVariables.APPLICATION_CANONICAL_NAME);
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")) …Run Code Online (Sandbox Code Playgroud)