2012-05-30 6 views
8

Estoy intentando leer la configuración del proxy WIFIObtención de ajustes Wi-Fi proxy en Android

  • Proxy anfitrión
  • puerto
  • Proxy
  • usuario proxy (autenticación)
  • contraseña Proxy (autenticación)

desde dispositivos en las versiones de Android 2.XX - 4.XX sin ningún éxito.

Calling:

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

Siempre devuelve nulo.

También he añadido a mi manifiesto de Android:

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

todavía se devuelve un valor nulo.

También probamos: llama

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

también devuelve nulo.

¿Existe un código de trabajo que recupera todos estos ajustes o al menos parcialmente con los productos en todas las versiones de Android?

+1

Hola usuario1222022. ¿Has resuelto tu problema? – Chris

Respuesta

12

Encontré este proyecto: Android Proxy Library que proporciona formas compatibles con versiones anteriores para consultar las configuraciones de Proxy y configurarlas para WebViews en versiones anteriores de 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()); 

Sin embargo, hay algo que debe entender sobre la configuración de Proxy establecida en un WiFi AP. Dado que la configuración de proxy específica de WiFi no se implementó en Android propiamente dicho hasta 3.1, todos los dispositivos anteriores a la versión 3.1 que exponen esa funcionalidad están utilizando algún tipo de hack personalizado. No funcionan de ninguna manera estándar. Así que las bibliotecas como esta no podrán tomar ningún conjunto de proxy de uno de esos hacks.

Sin embargo, hay un Proxy de todo el sistema en pre-3.1 que este tipo de biblioteca TOMARÁ agarrar. Por supuesto, Android consideró apropiado no proporcionar ninguna forma oficial de modificar esta configuración. Sin embargo, hay aplicaciones en Play Store que le permitirá hacerlo, este es el que yo estoy usando: Proxy Settings y funciona bien, preparando el proxy del sistema y lo que le permite agarrar ya sea a través de esta biblioteca, o métodos aún más simples como consultar la configuración proxy de JVM.

terminé por no usar el APL y en su lugar fui con una aplicación mucho más simple:

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

Hola, soy el desarrollador que creó la biblioteca Proxy de Android. Se puede encontrar más información sobre APL en el sitio oficial del proyecto: [http://www.android-proxy.com] (http://www.android-proxy.com) – lechuckcaptain

+0

el método IS_ICS_OR_LATER no funciona en 2.3.4 – Tirtha

+0

@Tirtha Debe tener como objetivo una versión posterior del sistema operativo, por supuesto, con su versión mínima configurada más baja. Hemos probado y utilizado esto de vuelta al nivel 7 de la API (2.1) y todavía lo estamos usando activamente en las API 8 y 9 (2.2 y 2.3), así que definitivamente funciona. – Adam

3

Esto es lo que estoy 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

Funcionó para mí ... Es bueno usar la reflexión en API <21, sin dependencia de biblioteca externa. –

+0

¿Cuál es el equivalente de Android Marshmallow? – AndroWeed

0

siguiente es el fragmento de código para recuperar los detalles 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; 
    } 

Devolverá enmpty si se detecta alguna excepción o no proxy;

+0

¿Qué es 'IsPreIcs'? ¿Por qué sabes si programáticamente puedo saber si un wifi tiene bloqueos de servicios como instagram de WhatsApp, etc.? –

Cuestiones relacionadas