2012-05-16 5 views
13

La documentazione per gli sviluppatori Android dicono quanto segue circa Settings.Secure.HTTP_PROXY:Settings.Secure.HTTP_PROXY deprecato in ICS, ma non informazioni sulla sostituzione

nome host e la porta per il proxy http globale. Usi ':' separatore tra il host e port TODO - deprecate a favore di global_http_proxy_host, ecc

Ma non c'è alcuna informazione sul global_http_proxy_host. Ora ottengo sempre null quando provo a leggere Settings.Secure.HTTP_PROXY.

Settings.Secure.HTTP_PROXY funzionava correttamente in tutte le versioni prima di ICS.

risposta

5

È possibile utilizzare Java Reflection per impostare il proxy globale testato su ICS.

codice aggiornato

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

Ora è possibile filtrare gli URL che utilizzano server proxy.

O guarda il blog this questo è in cinese ma puoi leggere il codice è abbastanza facile da capire.

+0

Grazie, Sunny! Potresti per favore farmi sapere che cosa è oauthPage utilizzato nell'esempio di codice? Quindi questo imposterà il proxy per la tua app o avrà un impatto su tutte le app a livello globale? – Safecoder

+0

Quindi, se ho capito bene, questo imposta solo proxy per la singola oauthPage, che è un oggetto webview. È corretto? Posso usarlo per impostare il proxy per tutto il mio traffico http per la mia app? Quello che sto cercando è un ambiente globale, il che significa che influenzerebbe anche altre app, ad esempio il browser. Per favore fammi sapere cosa pensi. Grazie! – Safecoder

+0

Ho provato un semplice test case con un solo oggetto Webview. Quindi usato il tuo codice per impostare il proxy. Perché tu usi my.proxy.com:1234 come proxy, quindi mi aspetto che la webview non si carichi perché tale proxy non esiste. Ma carica google.com senza alcun problema. Hai un progetto di lavoro che posso provare? Ho anche provato il codice nel tuo collegamento e ho chiamato ProxySettings.setProxy (questo, "mio.proxy.com", 1234); ma anche nessun effetto. Pagina di caricamento di Webview bene. – Safecoder

1

Sto andando solo in base a ciò che dice la documentazione, ma mi sembra che Settings.Secure.HTTP_PROXY non sia attualmente deprecato. La nota (sciatta) nella documentazione era solo una nota dello sviluppatore secondo cui il team di Android potrebbe prendere in considerazione l'idea di fare in futuro.

+0

Grazie, Tony. Ho appena aggiunto più informazioni al post originale. Sto cercando un modo per impostare il proxy globale in ICS. Ho utilizzato un'attività nascosta per impostare Settings.Secure.HTTP_PROXY per le versioni precedenti a ICS. Ma non funziona più. Eventuali suggerimenti? – Safecoder

Problemi correlati