2012-05-16 12 views
13

Android developer docs powiedzieć o Settings.Secure.HTTP_PROXY następujące:Settings.Secure.HTTP_PROXY przestarzałe w ICS, ale brak informacji o wymianie

nazwę hosta i port serwera proxy HTTP globalnej. Używa „:” separator dla hosta i port pomiędzy TODO - potępiać za global_http_proxy_host itp

Ale nie ma żadnej informacji o global_http_proxy_host. Teraz zawsze otrzymuję null podczas próby odczytu Settings.Secure.HTTP_PROXY.

Settings.Secure.HTTP_PROXY działa poprawnie we wszystkich wersjach przed ICS.

Odpowiedz

5

Możesz użyć Java Reflection, aby ustawić globalny proxy testowany na ICS.

zaktualizowany kod

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;  
} 

teraz można odfiltrować adresy URL za pomocą serwera proxy.

LUB spójrz na blog this w języku chińskim, ale możesz przeczytać kod, który jest dość łatwy do zrozumienia.

+0

Dzięki, Sunny! Czy mógłbyś dać mi znać, co jest oauthPage używane w twoim przykładzie kodu? Czy to ustawi serwer proxy dla twojej własnej aplikacji, czy będzie to miało wpływ na wszystkie aplikacje na całym świecie? – Safecoder

+0

Więc jeśli rozumiem to poprawnie, to ustawia tylko proxy dla pojedynczego oauthPage, który jest obiektem przeglądania. Czy to jest poprawne? Czy mogę go użyć do ustawienia proxy dla całego mojego ruchu http dla mojej aplikacji? To, czego szukam, to ustawienie globalne, co oznacza, że ​​wpłynie również na inne aplikacje, na przykład przeglądarkę. Proszę, podziel się swoimi myślami. Dzięki! – Safecoder

+0

Próbowałem prosty przypadek testowy z tylko jednym obiektem Webview. Następnie użyj swojego kodu do ustawienia proxy. Ponieważ używasz my.proxy.com:1234 jako serwera proxy, więc oczekiwałbym, że przeglądarka nie załaduje się, ponieważ taki serwer proxy nie istnieje. Ale ładuje google.com bez problemu. Czy masz działający projekt, który mogę wypróbować? Próbowałem również kod w twoim linku i nazwał ProxySettings.setProxy (to, "my.proxy.com", 1234); ale także bez efektu. Strona ładowania strony internetowej jest w porządku. – Safecoder

1

Po prostu przechodzę przez to, co mówi dokumentacja, ale czytamy, że Settings.Secure.HTTP_PROXY nie jest obecnie przestarzałe. Notatka (niechlujna) w dokumentacji była tylko notatką dewelopera, że ​​jest to coś, co zespół Android może rozważyć w przyszłości.

+0

Dzięki, Tony. Właśnie dodałem więcej informacji do oryginalnego postu. Szukam sposobu na ustawienie globalnego proxy w ICS. Używam ukrytej aktywności do ustawienia Settings.Secure.HTTP_PROXY dla wersji sprzed ICS. Ale już nie działa. Jakieś sugestie? – Safecoder

Powiązane problemy