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 中已弃用,但没有关于更换的信息的主要内容,如果未能解决你的问题,请参考以下文章