Settings.Secure.HTTP_PROXY 在 ICS 中已弃用,但没有关于更换的信息
Posted
技术标签:
【中文标题】Settings.Secure.HTTP_PROXY 在 ICS 中已弃用,但没有关于更换的信息【英文标题】:Settings.Secure.HTTP_PROXY deprecated in ICS but no information on replacement 【发布时间】:2012-05-23 14:14:11 【问题描述】:android 开发者文档对Settings.Secure.HTTP_PROXY
有以下说法:
全局 http 代理的主机名和端口。在主机和端口 TODO 之间使用 ':' 分隔符 - 不赞成使用 global_http_proxy_host 等
但是没有任何关于global_http_proxy_host
的信息。现在我在尝试阅读 Settings.Secure.HTTP_PROXY
时总是得到 null
。
Settings.Secure.HTTP_PROXY
在 ICS 之前的所有版本中都能正常工作。
【问题讨论】:
【参考方案1】:您可以使用 Java Reflection 设置在 ICS 上测试的全局代理。
更新代码
Activity activity = this;
private void setProxtAndPortOnICS(String porxyServer2, int port2)
try
Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge");
Class params[] = new Class[1];
params[0] = Class.forName("android.net.ProxyProperties");
Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params);
Class wv = Class.forName("android.webkit.WebView");
Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore");
Object mWebViewCoreFieldIntance = getFieldValueSafely(mWebViewCoreField, oauthPage);
Class wvc = Class.forName("android.webkit.WebViewCore");
Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame");
Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldIntance);
Class bf = Class.forName("android.webkit.BrowserFrame");
Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge");
Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame);
Class ppclass = Class.forName("android.net.ProxyProperties");
Class pparams[] = new Class[3];
pparams[0] = String.class;
pparams[1] = int.class;
pparams[2] = String.class;
Constructor ppcont = ppclass.getConstructor(pparams);
updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance("my.proxy.com", 1234, null));
catch (Exception ex)
private Object getFieldValueSafely(Field field, Object classInstance) throws IllegalArgumentException, IllegalAccessException
boolean oldAccessibleValue = field.isAccessible();
field.setAccessible(true);
Object result = field.get(classInstance);
field.setAccessible(oldAccessibleValue);
return result;
现在您可以使用代理服务器过滤掉 url。
或者看看this博客这是中文的,但是你可以阅读它很容易理解的代码。
【讨论】:
谢谢,桑尼!您能否让我知道您的代码示例中使用的 oauthPage 是什么?那么这将为您自己的应用设置代理还是会影响全球所有应用? 所以如果我理解正确,这只会为单个 oauthPage 设置代理,它是一个 webview 对象。这是正确的吗?我可以使用它为我的应用程序的所有 http 流量设置代理吗?我正在寻找的是一个全局设置,这意味着它也会影响其他应用程序,例如浏览器。请让我知道你的想法。谢谢! 我用一个 Webview 对象尝试了一个简单的测试用例。然后使用您的代码设置代理。因为您使用 my.proxy.com:1234 作为代理,所以我预计 webview 将无法加载,因为这样的代理不存在。但它加载 google.com 没有任何问题。你有我可以尝试的工作项目吗?我还尝试了您链接中的代码并调用了 ProxySettings.setProxy(this, "my.proxy.com", 1234);但也没有效果。 Webview 加载页面就好了。 这将设置全局代理,如果你想在你的 web 视图中使用它,那么你必须覆盖webviewclient
中的一个方法,它验证用户名/密码组合。其实上面的代码是不完整的,过段时间我会发布完整的代码。我现在在办公室很忙。
谢谢,桑尼。期待你的更新。真的很感激!【参考方案2】:
我只是按照文档中的说明进行操作,但在我看来,Settings.Secure.HTTP_PROXY
目前并未被弃用。文档中的(草率)注释只是开发人员的注释,这是 Android 团队可能考虑在未来做的事情。
【讨论】:
谢谢,托尼。刚刚在原始帖子中添加了更多信息。我正在寻找一种在 ICS 中设置全局代理的方法。我一直在使用隐藏活动为 ICS 之前的版本设置 Settings.Secure.HTTP_PROXY。但它不再起作用了。有什么建议吗?以上是关于Settings.Secure.HTTP_PROXY 在 ICS 中已弃用,但没有关于更换的信息的主要内容,如果未能解决你的问题,请参考以下文章