Android Context Set setProxy(Context ctx, String host, int port)

Here you can find the source of setProxy(Context ctx, String host, int port)

Description

set Proxy

Declaration

public static boolean setProxy(Context ctx, String host, int port)
            throws Exception 

Method Source Code

//package com.java2s;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.apache.http.HttpHost;

import android.content.Context;

import android.os.Build;
import android.util.Log;

public class Main {
    private final static String DEFAULT_HOST = "127.0.0.1";
    private final static int DEFAULT_PORT = 8118;

    public static void setProxy(Context ctx) throws Exception {
        setProxy(ctx, DEFAULT_HOST, DEFAULT_PORT);
    }//from w w  w.j a  v a2  s .co  m

    public static boolean setProxy(Context ctx, String host, int port)
            throws Exception {
        setSystemProperties(host, port);

        boolean worked = false;

        if (Build.VERSION.SDK_INT < 14) {
            worked = setWebkitProxyGingerbread(ctx, host, port);
        } else {
            worked = setWebkitProxyICS(ctx, host, port);
        }

        return worked;
    }

    private static void setSystemProperties(String host, int port) {

        System.setProperty("http.proxyHost", host);
        System.setProperty("http.proxyPort", port + "");

        /*
        System.setProperty("https.proxyHost", host);
        System.setProperty("https.proxyPort", port + "");
                
        System.setProperty("socks.proxyHost", host);
        System.setProperty("socks.proxyPort", port + "");
         */

        System.getProperty("networkaddress.cache.ttl", "-1");

    }

    /**
     * Override WebKit Proxy settings
     *
     * @param ctx Android ApplicationContext
     * @param host
     * @param port
     * @return  true if Proxy was successfully set
     */
    private static boolean setWebkitProxyGingerbread(Context ctx,
            String host, int port) throws Exception {
        boolean ret = false;

        Object requestQueueObject = getRequestQueue(ctx);
        if (requestQueueObject != null) {
            //Create Proxy config object and set it into request Q
            HttpHost httpHost = new HttpHost(host, port, "http");
            setDeclaredField(requestQueueObject, "mProxyHost", httpHost);
            return true;
        }
        return false;

    }

    private static boolean setWebkitProxyICS(Context ctx, String host,
            int port) throws Exception {

        // PSIPHON: added support for Android 4.x WebView proxy
        try {
            Class webViewCoreClass = Class
                    .forName("android.webkit.WebViewCore");

            Class proxyPropertiesClass = Class
                    .forName("android.net.ProxyProperties");
            if (webViewCoreClass != null && proxyPropertiesClass != null) {
                Method m = webViewCoreClass.getDeclaredMethod(
                        "sendStaticMessage", Integer.TYPE, Object.class);
                Constructor c = proxyPropertiesClass.getConstructor(
                        String.class, Integer.TYPE, String.class);

                if (m != null && c != null) {
                    m.setAccessible(true);
                    c.setAccessible(true);
                    Object properties = c.newInstance(host, port, null);

                    // android.webkit.WebViewCore.EventHub.PROXY_CHANGED = 193;
                    m.invoke(null, 193, properties);
                    return true;
                } else
                    return false;
            }
        } catch (Exception e) {
            Log.e("ProxySettings",
                    "Exception setting WebKit proxy through android.net.ProxyProperties: "
                            + e.toString());
        } catch (Error e) {
            Log.e("ProxySettings",
                    "Exception setting WebKit proxy through android.webkit.Network: "
                            + e.toString());
        }

        return false;

    }

    public static Object getRequestQueue(Context ctx) throws Exception {
        Object ret = null;
        Class networkClass = Class.forName("android.webkit.Network");
        if (networkClass != null) {
            Object networkObj = invokeMethod(networkClass, "getInstance",
                    new Object[] { ctx }, Context.class);
            if (networkObj != null) {
                ret = getDeclaredField(networkObj, "mRequestQueue");
            }
        }
        return ret;
    }

    private static void setDeclaredField(Object obj, String name,
            Object value) throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        f.set(obj, value);
    }

    private static Object invokeMethod(Object object, String methodName,
            Object[] params, Class... types) throws Exception {
        Object out = null;
        Class c = object instanceof Class ? (Class) object : object
                .getClass();
        if (types != null) {
            Method method = c.getMethod(methodName, types);
            out = method.invoke(object, params);
        } else {
            Method method = c.getMethod(methodName);
            out = method.invoke(object);
        }
        //System.out.println(object.getClass().getName() + "." + methodName + "() = "+ out);
        return out;
    }

    private static Object getDeclaredField(Object obj, String name)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        Field f = obj.getClass().getDeclaredField(name);
        f.setAccessible(true);
        Object out = f.get(obj);
        //System.out.println(obj.getClass().getName() + "." + name + " = "+ out);
        return out;
    }
}

Related

  1. setBaiduServiceEnabled(Context paramContext, boolean paramBoolean)
  2. setContext(Application app)
  3. setDefaultLocale(Context context, String locale)
  4. setLanguage(Context context, String language)
  5. setProxy(Context ctx)
  6. setRevokedPermissions(String packageName, String[] permissions, Context ctx)
  7. setWebkitProxyGingerbread(Context ctx, String host, int port)
  8. setWebkitProxyICS(Context ctx, String host, int port)
  9. setWelcomeShown(final Context ctx)