2012-05-30 86 views
8

Tôi cố gắng để đọc cài đặt proxy WIFIBắt cài đặt proxy WiFi trong Android

  • Proxy chủ
  • cổng
  • Proxy
  • Proxy người dùng (authentication)
  • Proxy password (xác thực)

từ các thiết bị trong phiên bản Android 2.XX - 4.XX mà không có bất kỳ thành công nào.

Calling:

String proxy = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.HTTP_PROXY); 

Luôn luôn trả về null.

Tôi cũng đã thêm vào manifest android của tôi:

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 

vẫn nó sẽ trả về null.

Cũng thử:

android.net.Proxy. getHost(Context ctx) – which is deprecated – returns the IP 
android.net.Proxy. getPortt(Context ctx) – which is deprecated – returns always -1. 

Java gọi:

System.getProperty("http.proxyHost"); 
System.getProperty("http.proxyCall"); 

Cũng trả về null.

Có mã hoạt động nào truy xuất tất cả các cài đặt này hoặc ít nhất một phần từ thiết bị trong tất cả các phiên bản Android không?

+1

Xin chào user1222022. Bạn đã giải quyết được vấn đề của mình chưa? – Chris

Trả lời

12

Tôi đã tìm thấy dự án này: Android Proxy Library Cung cấp các cách tương thích ngược để truy vấn cài đặt Proxy cũng như đặt chúng cho WebView trên các phiên bản Android cũ hơn.

// Grab Proxy settings in a backwards compatible manner 
    ProxyConfiguration proxyConfig = ProxySettings.getCurrentHttpProxyConfiguration(context); 

    // Set Proxy for WebViews on older versions of Android 
    ProxyUtils.setWebViewProxy(getActivity().getApplicationContext()); 

Tuy nhiên, có điều bạn cần hiểu về Cài đặt proxy được đặt trên WiFi AP. Vì Cài đặt proxy cụ thể WiFi không được triển khai trong Android cho đến 3.1, tất cả các thiết bị trước 3.1 cho thấy chức năng đó đang sử dụng một số loại hack tùy chỉnh. Chúng không hoạt động theo bất kỳ cách nào tiêu chuẩn. Vì vậy, các thư viện như thế này sẽ không thể lấy bất kỳ proxy nào được thiết lập từ một trong những hacks đó.

Tuy nhiên, có một Proxy hệ thống rộng ở trước 3.1 rằng loại thư viện này S 01N lấy. Tất nhiên Android thấy phù hợp không cung cấp bất kỳ cách chính thức nào để sửa đổi cài đặt này. Nhưng có các ứng dụng trên Cửa hàng Play cho phép bạn thực hiện, đây là ứng dụng tôi đang sử dụng: Proxy Settings và hoạt động tốt, thiết lập Proxy hệ thống và cho phép bạn lấy thông qua thư viện này hoặc thậm chí là các phương pháp đơn giản hơn như truy vấn cài đặt proxy JVM.

tôi đã kết thúc không sử dụng APL và thay vào đó đã đi với một thực hiện đơn giản hơn nhiều:

private static final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; 

    ... 

    String proxyAddress; 
    int proxyPort; 

    if(IS_ICS_OR_LATER) 
    { 
     proxyAddress = System.getProperty("http.proxyHost"); 

     String portStr = System.getProperty("http.proxyPort"); 
     proxyPort = Integer.parseInt((portStr != null ? portStr : "-1")); 
    } 
    else 
    { 
     proxyAddress = android.net.Proxy.getHost(context); 
     proxyPort = android.net.Proxy.getPort(context); 
    } 
+3

Xin chào, tôi là nhà phát triển đã tạo Thư viện proxy Android. Một số thông tin thêm về APL có thể được tìm thấy trên trang web chính thức của dự án: [http://www.android-proxy.com] (http://www.android-proxy.com) – lechuckcaptain

+0

phương pháp IS_ICS_OR_LATER không hoạt động trên 2.3.4 – Tirtha

+0

@Tirtha Bạn phải nhắm mục tiêu phiên bản hệ điều hành sau này, với phiên bản tối thiểu của bạn được đặt thấp hơn. Chúng tôi đã thử nghiệm và sử dụng điều này trở lại API cấp 7 (2.1) và vẫn đang tích cực sử dụng nó trên API 8 & 9 (2.2 & 2.3) để nó chắc chắn hoạt động. – Adam

3

Đây là những gì tôi đang sử dụng:

public static String[] getUserProxy(Context context) 
{ 
    Method method = null; 
    try 
    { 
     method = ConnectivityManager.class.getMethod("getProxy"); 
    } 
    catch (NoSuchMethodException e) 
    { 
     // Normal situation for pre-ICS devices 
     return null; 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 

    try 
    { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     Object pp = method.invoke(connectivityManager); 
     if (pp == null) 
     return null; 

     return getUserProxy(pp); 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
    } 


private static String[] getUserProxy(Object pp) throws Exception 
{ 
    String[] userProxy = new String[3]; 

    String className = "android.net.ProxyProperties"; 
    Class<?> c = Class.forName(className); 
    Method method; 

    method = c.getMethod("getHost"); 
    userProxy[0] = (String) method.invoke(pp); 

    method = c.getMethod("getPort"); 
    userProxy[1] = String.valueOf((Integer) method.invoke(pp)); 


    method = c.getMethod("getExclusionList"); 
    userProxy[2] = (String) method.invoke(pp); 

    if (userProxy[0] != null) 
     return userProxy; 
    else 
     return null; 
} 
+0

Làm việc cho tôi ... Tốt để sử dụng sự phản chiếu trên API <21, không phụ thuộc vào thư viện bên ngoài. –

+0

Tương đương với Android Marshmallow là gì? – AndroWeed

0

Sau đây là đoạn mã để lấy chi tiết Proxy

public static String getProxyDetails(Context context) { 
     String proxyAddress = new String(); 
     try { 
      if (IsPreIcs()) { 
       proxyAddress = android.net.Proxy.getHost(context); 
       if (proxyAddress == null || proxyAddress.equals("")) { 
        return proxyAddress; 
       } 
       proxyAddress += ":" + android.net.Proxy.getPort(context); 
      } else { 
       proxyAddress = System.getProperty("http.proxyHost"); 
       proxyAddress += ":" + System.getProperty("http.proxyPort"); 
      } 
     } catch (Exception ex) { 
      //ignore 
     } 
     return proxyAddress; 
    } 

Nó sẽ trở lại nếu một số ngoại lệ hoặc không có proxy được phát hiện;

+0

'IsPreIcs' là gì? btw bạn có biết nếu lập trình tôi có thể biết nếu một wifi có dịch vụ bị chặn như instagram whatsapp, vv ..? –

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