14

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

  • 代理主机
  • 代理端口
  • 代理用户(认证)
  • 代理密码(认证)

从 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 版本的设备中检索?

4

4 回答 4

15

我找到了这个项目: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 之前的设备都在使用某种自定义黑客。它们不以任何标准方式工作。因此,像这样的库将无法从其中一个黑客中获取任何代理集。

然而,在 pre-3.1 中有一个系统范围的代理,这种库抓住。当然,Android 认为不提供任何官方方式来修改此设置是合适的。但是 Play Store 上有一些应用程序可以让你这样做,这是我正在使用的:代理设置,它运行良好,设置系统代理并允许你通过这个库获取它,甚至更简单查询 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 );
    }
于 2012-11-28T23:08:37.283 回答
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;
}
于 2014-03-28T08:12:09.260 回答
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;

于 2014-06-04T12:30:40.193 回答
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 = ""
)
于 2020-01-04T10:50:15.370 回答