2013-06-28 19 views
2

我已经安装使用下面这段程式码,我的WebView代理:的WebView不打服务器套接字代理

ProxySettings.setProxy(mContext, "http://127.0.0.1", PORT); 

这里是我的socket服务器监听

serverSocket = new ServerSocket(PORT); 
thread = new Thread(runnable, this.getClass().getSimpleName()); 


public void startlistener() { 
     listening = true; 
     thread.start(); 

    } 

private Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 
      while (listening) { 
       try { 
        Socket accept = serverSocket.accept(); 

        String data = getData(accept); 

        httpHandler.handleRequest(data); 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     } 
    }; 

我已经把一个断点字符串数据= getData(accept);它从不打它

下面是https://gist.github.com/madeye/2297083

public class ProxySettings { 

    private static final String TAG = "GAEProxy.ProxySettings"; 

    static final int PROXY_CHANGED = 193; 

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

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

    public static void resetProxy(Context ctx) throws Exception { 
     Object requestQueueObject = getRequestQueue(ctx); 
     if (requestQueueObject != null) { 
      setDeclaredField(requestQueueObject, "mProxyHost", null); 
     } 
    } 

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

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

     try { 
      if (Build.VERSION.SDK_INT < 14) { 

       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); 
        ret = true; 
       } 

      } else { 
       ret = setICSProxy(host, port); 
      } 
     } catch (Exception e) { 
      Log.e(TAG, "error setting up webkit proxying", e); 
     } 
     return ret; 
    } 

    private static boolean setICSProxy(String host, int port) 
      throws ClassNotFoundException, NoSuchMethodException, 
      IllegalArgumentException, InstantiationException, 
      IllegalAccessException, InvocationTargetException { 
     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); 
      m.setAccessible(true); 
      c.setAccessible(true); 
      Object properties = c.newInstance(host, port, null); 
      m.invoke(null, PROXY_CHANGED, properties); 
      return true; 
     } 
     return false; 

    } 

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

    } 
} 

采取的代理类,我失去了什么?

ServerSocket运行在与webview运行相同的android应用程序中,并且想法是重定向所有http请求以通过我的套接字服务器代理。

感谢

编辑:我调试代理代码,它失败并引发此异常

07-01 15:44:02.894: E/GAEProxy.ProxySettings(11267): error setting up webkit proxying = java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

当我打电话setProxy它发生。

有什么建议?

回答

0

如果您的应用程序未使用系统签名进行签名,则无法以编程方式设置代理。 How can you set the http proxy programatically?

+0

只有当你想设置的全球代理的系统,不过是我的全部这里做的是将其设置为我自己的应用程序的网页流量 – jonney