2012-05-16 23 views
13

Các tài liệu nhà phát triển Android nói như sau về Settings.Secure.HTTP_PROXY:Settings.Secure.HTTP_PROXY bị phản đối trong ICS nhưng không có thông tin về thay thế

tên Host và cổng proxy http toàn cầu. Sử dụng ':' seperator cho giữa máy chủ và cổng TODO - không dùng nữa cho toàn cầu_http_proxy_host, v.v.

Nhưng không có bất kỳ thông tin nào về global_http_proxy_host. Bây giờ tôi luôn nhận được null khi cố gắng đọc Settings.Secure.HTTP_PROXY.

Settings.Secure.HTTP_PROXY đã hoạt động bình thường trong tất cả các bản phát hành trước ICS.

Trả lời

5

Bạn có thể sử dụng Java Reflection để đặt proxy toàn cầu được thử nghiệm trên ICS.

CẬP NHẬT MÃ

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

bây giờ bạn có thể lọc ra các url sử dụng máy chủ proxy.

HOẶC xem this blog bằng tiếng Trung Quốc nhưng bạn có thể đọc mã dễ hiểu.

+0

Cảm ơn, Sunny! Bạn có thể vui lòng cho tôi biết oauthPage được sử dụng trong ví dụ mã của bạn là gì không? Vì vậy, điều này sẽ thiết lập proxy cho ứng dụng của riêng bạn hoặc nó sẽ tác động đến tất cả các ứng dụng trên toàn cầu? – Safecoder

+0

Vì vậy, nếu tôi hiểu nó một cách chính xác, điều này chỉ đặt proxy cho oauthPage duy nhất, đó là một đối tượng webview. Nó có đúng không? Tôi có thể sử dụng nó để đặt proxy cho tất cả lưu lượng truy cập http của mình cho ứng dụng của mình không? Những gì tôi đang tìm kiếm là một thiết lập toàn cầu, có nghĩa là nó sẽ ảnh hưởng đến các ứng dụng khác, ví dụ như trình duyệt. Xin vui lòng cho tôi biết suy nghĩ của bạn. Cảm ơn! – Safecoder

+0

Tôi đã thử một trường hợp thử nghiệm đơn giản chỉ với một đối tượng Webview. Sau đó, sử dụng mã của bạn để đặt proxy. Bởi vì bạn sử dụng my.proxy.com:1234 làm proxy nên tôi hy vọng webview sẽ không tải được vì proxy đó không tồn tại. Nhưng nó tải google.com mà không có bất kỳ vấn đề gì. Bạn có một dự án làm việc mà tôi có thể thử không? Tôi cũng đã thử mã trong liên kết của bạn và được gọi là ProxySettings.setProxy (điều này, "my.proxy.com", 1234); nhưng cũng không có hiệu lực. Trang tải trang web xem tốt. – Safecoder

1

Tôi chỉ đọc những gì tài liệu nói, nhưng nó đọc cho tôi rằng Settings.Secure.HTTP_PROXY hiện không được chấp nhận. Lưu ý (cẩu thả) trong tài liệu chỉ là ghi chú của nhà phát triển rằng đây là điều mà nhóm Android có thể cân nhắc thực hiện trong tương lai.

+0

Cảm ơn, Tony. Chỉ cần thêm thông tin vào bài đăng gốc. Tôi đang tìm cách thiết lập proxy toàn cầu trong ICS. Tôi đã sử dụng hoạt động ẩn để đặt Cài đặt.Secure.HTTP_PROXY cho bản phát hành trước ICS. Nhưng nó không còn làm việc nữa. Bất kỳ đề xuất? – Safecoder

Các vấn đề liên quan