2012-05-30 41 views
8
無線網絡的代理設置

我想讀WIFI代理設置獲取Android中

  • 代理主機
  • 代理端口
  • 代理用戶(認證)
  • 代理密碼(認證)

來自android版本2.XX - 4.XX中的設備沒有任何成功。

呼叫:

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

始終返回null。

我也加入到我的Android清單:

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

仍然返回null。

也試過:

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調用:

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

也返回null。

是否有工作代碼檢索所有這些設置或至少部分從所有Android版本的設備?

+1

Hello user1222022。你解決了你的問題嗎? – Chris

回答

12

我發現這個項目:Android Proxy Library 它提供了向後兼容的查詢代理設置的方式,以及在較舊版本的Android上爲WebViews設置它們。

// 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()); 

但是,您需要了解有關WiFi AP上設置的代理設置的內容。由於WiFi特定代理設置直到3.1纔在Android中實現,所有暴露該功能的3.1之前的設備都使用某種自定義黑客。他們不以任何標準方式工作。所以像這樣的圖書館將無法從這些黑客手中獲取任何代理集。

然而,在3.1之前有一個系統範圍的代理,這種庫搶。當然,Android認爲不提供任何官方方式來修改此設置。但Play商店中有許多應用可以讓你做到這一點,這就是我正在使用的應用:Proxy Settings,它運行良好,設置系統代理並允許您通過這個庫或甚至更簡單的方法來獲取它如查詢JVM代理設置。

我結束了不使用APL,而是以更簡單的實現去:

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

嗨,我是創建Android代理庫的開發人員。有關APL的更多信息可在該項目的官方網站上找到:[http://www.android-proxy.com](http://www.android-proxy.com) – lechuckcaptain

+0

IS_ICS_OR_LATER方法不起作用在2.3.4上 – Tirtha

+0

@Tirtha你必須定位到後來的操作系統版本,最低版本設置得更低。我們已經測試並將其用於API級別7(2.1),並且仍然在API 8&9(2.2和2.3)上積極使用它,所以它確實可行。 – Adam

3

這是我使用的是什麼:

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

爲我工作......很好的使用API​​ <21上的反射,沒有外部庫依賴。 –

+0

什麼是Android棉花糖的等價物? – AndroWeed

0

以下是代碼片段檢索代理詳細信息

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

如果檢測到一些異常或沒有代理,它會返回enmpty;

+0

什麼是'IsPreIcs'?順便說一句,你知道如果以編程方式,我可以知道如果一個wifi有服務封鎖像whatsapp instagram等..? –