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 で 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 固有のプロキシ設定は Android 3.1 まで適切に実装されていなかったため、その機能を公開する 3.1 より前のデバイスはすべて、何らかのカスタム ハックを使用しています。それらは、標準的な方法では機能しません。したがって、このようなライブラリは、これらのハックのいずれかからプロキシ セットを取得することはできません。

ただし、3.1 より前には、この種のライブラリが取得するシステム ワイド プロキシがあります。もちろん、Android は、この設定を変更するための公式な方法を提供しないことに適していると判断しました。しかし、Playストアにはそれを可能にするアプリがあります。これは私が使用しているものです:プロキシ設定とそれはうまく機能し、システムプロキシを設定し、このライブラリを介して、またはさらに簡単に取得できるようにします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 に答える