在Android中获取WiFi代理设置

时间:2012-05-30 07:19:49

标签: android proxy wifi

我正在尝试阅读WIFI代理设置

  • 代理主机
  • 代理端口
  • 代理用户(身份验证)
  • 代理密码(身份验证)

来自Android版本2.X.X - 4.X.X中的设备没有任何成功。

致电:

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版本的设备?

4 个答案:

答案 0 :(得分:13)

我找到了这个项目:Android Proxy Library 它提供了向后兼容的查询代理设置的方法,以及在旧版Android上为WebView设置它们。

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

答案 1 :(得分: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;
}

答案 2 :(得分: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;

答案 3 :(得分:0)

private fun getUserProxy(context: Context): Data {
    return try {
        val declaredField = WifiConfiguration::class.java.getDeclaredField("mIpConfiguration")
        declaredField.isAccessible = true

        val data =
            (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as? WifiManager)
                ?.configuredNetworks
                ?.asSequence()
                ?.mapNotNull {
                    try {
                        declaredField.get(it)
                    } catch (e: Exception) {
                        e.printStackTrace()
                        null
                    }
                }
                ?.mapNotNull {
                    try {
                        (it.javaClass.getDeclaredField("httpProxy").get(it) as? ProxyInfo)
                    } catch (e: Exception) {
                        e.printStackTrace()
                        null
                    }
                }
                ?.find { !it.host.isNullOrEmpty() }
                ?.let { Data(it.host ?: "", it.port.toString()) }
                ?: Data()

        declaredField.isAccessible = false
        return data
    } catch (e: Exception) {
        e.printStackTrace()
        Data()
    }
}

data class Data(
    val host: String = "",
    val port: String = ""
)