2012-05-30 7 views
8

Sto cercando di leggere le impostazioni del proxy WIFICome impostazioni proxy WiFi in Android

  • Proxy ospite
  • porta
  • proxy
  • utente proxy (autenticazione)
  • Password proxy (autenticazione)

dai dispositivi nelle versioni Android 2.XX - 4.XX senza alcun successo.

Calling:

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

restituisce sempre null.

Ho anche aggiunto al mio manifesto Android:

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

ancora restituisce null.

cercato anche: chiama

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"); 

restituisce anche nullo.

Esiste un codice funzionante che recupera tutte queste impostazioni o almeno parzialmente dai dispositivi in ​​tutte le versioni di Android?

+1

Ciao utente1222022. Hai risolto il tuo problema? – Chris

risposta

12

Ho trovato questo progetto: Android Proxy Library Quale fornisce modi compatibili con le versioni precedenti di eseguire query sulle impostazioni Proxy così come impostarli per WebViews su versioni precedenti di Android.

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

Tuttavia, è necessario conoscere le impostazioni del proxy impostate su un punto di accesso WiFi. Poiché le impostazioni proxy specifiche WiFi non sono state implementate in Android corretto fino al 3.1, tutti i dispositivi precedenti alla 3.1 che espongono tale funzionalità utilizzano una sorta di hack personalizzato. Non funzionano in alcun modo standard. Quindi librerie come questa non saranno in grado di prendere alcun set di proxy da uno di questi hack.

C'è comunque un System Wide Proxy in pre-3.1 che questo tipo di libreria WILL afferrare. Ovviamente Android ha ritenuto opportuno non fornire alcun modo ufficiale per modificare questa impostazione. Ma ci sono app sul Play Store che ti permetteranno di farlo, questa è quella che sto usando: Proxy Settings e funziona bene, impostando il System Proxy e permettendoti di afferrarlo tramite questa libreria, o anche con metodi più semplici come interrogare le impostazioni del proxy JVM.

ho finito per non usare l'APL e invece andato con un'implementazione molto più semplice:

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

Ciao, sono lo sviluppatore che ha creato la libreria proxy Android. Ulteriori informazioni su APL possono essere trovate sul sito ufficiale del progetto: [http://www.android-proxy.com] (http://www.android-proxy.com) – lechuckcaptain

+0

il metodo IS_ICS_OR_LATER non funziona 2.3.4 – Tirtha

+0

@Tirtha Ovviamente è necessario utilizzare come target una versione successiva del sistema operativo, con la versione minima impostata più bassa. Abbiamo testato e utilizzato questo livello fino al livello API 7 (2.1) e lo stiamo ancora utilizzando attivamente su API 8 e 9 (2.2 e 2.3), quindi funziona sicuramente. – Adam

3

Questo è quello che sto usando:

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

Ha funzionato per me ... Utile per l'uso della riflessione su API <21, senza dipendenza da libreria esterna. –

+0

Qual è l'equivalente per Android Marshmallow? – AndroWeed

0

seguente è frammento di codice per recuperare i dettagli del 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; 
    } 

Restituirà impoverito se viene rilevata qualche eccezione o nessun proxy;

+0

Che cos'è 'IsPreIcs'? btw sai se programmaticamente posso sapere se un wifi ha servizi bloccati come instagram whatsapp, ecc.? –