`
zlping
  • 浏览: 63738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在webview中设置代理

 
阅读更多

在android1.6之前的api中有有直接的方法来对webview设置代码,但是在之后的API中去掉了。所以只能寻求别的方法来设置代码。

下面代码是用反射原理来对webview设置代理:

    public static boolean setProxy(Context ctx, String host, int port) {
        boolean ret = false;
        try {
            Log.d("WebViewProxySettings", "setProxy defaulthost="+host+"port="+port);
            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;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
    
    
    public static String getProxyHostname(Context ctx){
    	String res = null;
    	try {
            Object requestQueueObject = getRequestQueue(ctx);
            if (requestQueueObject != null) {
            	Object fild = getDeclaredField(requestQueueObject,"mProxyHost");
            	if(fild!=null){
            		HttpHost host = (HttpHost)fild;
            		res = host.getHostName();
            	}
            }
    	 } catch (Exception e) {
             e.printStackTrace();
         }
        return res;
    }

    public static void cancelProxy(Context ctx){
    	try {
        Object requestQueueObject = getRequestQueue(ctx);
        if (requestQueueObject != null) {
            setDeclaredField(requestQueueObject, "mProxyHost", null);
        }
    	} catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    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;
    }
 
分享到:
评论

相关推荐

    WebViewProxy:设置 Android WebView 代理的类

    网络视图代理设置 Android WebView 代理的类

    webview通过代理访问网络

    2. 在Webview的生命周期方法中控制对系统代理设置的响应。 3. 提供一个接口让用户设置系统代理,通常是通过启动系统设置页面。 以上方法适用于大多数情况,但需要注意的是,不同Android版本可能有差异,部分设备...

    给winform设置代理

    在Windows Forms(Winform)应用开发中,有时候我们需要在内嵌的WebBrowser控件中设置代理服务器,以便通过特定的网络通道访问网页。这个过程涉及到WebBrowser控件的使用及其代理设置,对于开发者来说,理解并正确...

    实例详解Android Webview拦截ajax请求

    Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...

    Android WebView userAgent 设置为桌面UA实例

    在 Android 中,我们可以使用 WebView 的 getSettings() 方法来获取设置对象,然后使用 setUserAgentString() 方法来设置用户代理。例如: `WebView webView = (WebView) findViewById(R.id.webview);` `webView....

    DroidWebViewProxyDemo:Android WebView代理演示

    在某些情况下,我们可能需要在`WebView`中设置代理服务器,例如测试网络请求,或者在受限的网络环境中通过特定的代理来访问网页。在`DroidWebViewProxyDemo`中,开发者可能展示了如何配置`WebView`来使用自定义的...

    webview中java与js安全交互

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,并实现Java与JavaScript之间的交互。这种交互能力使得我们可以利用Web技术来增强原生应用的功能,同时保持了良好的用户体验。...

    ios webView获取html标签

    首先,我们需要在`UIViewController`中设置`UIWebView`并实现其代理方法。代理方法`webView(_:shouldStartLoadWith:)`允许我们在网页链接被点击前进行拦截和处理。以下是创建和设置`UIWebView`的基本步骤: ```...

    安卓 webview 单页面

    在这个案例中,我们可能会在 `onCreate()` 方法中设置Webview的相关属性。 总之,使用Webview加载单页面应用需要关注多个方面,包括基本的加载操作、交互设计、安全性以及性能优化。理解并掌握这些要点,能帮助我们...

    android 使用webview控件,注意在android9.0以后必须使用https才能访问网页

    2. 在Activity或Fragment中初始化并设置WebView: ```java WebView webView = findViewById(R.id.webView); webView.setWebViewClient(new WebViewClient()); webView.loadUrl("https://www.example.com"); ```...

    Android-Android实现微信webview兼容Android7.0

    在这个类中,你可以覆盖一些方法来定制Webview的行为,比如设置缓存策略、网络代理等。 3. **初始化TBS**:在应用程序启动时,你需要调用`X5CoreEngine.init`进行初始化,传入你的应用程序上下文和一个回调接口,...

    ios-webView加载进度和显示标题.zip

    在iOS开发中,WebView是一种非常重要的组件,它允许我们在应用程序中内嵌网页内容。这个"ios-webView加载进度和显示标题.zip"文件很显然聚焦于如何利用WebView来展示网页,并实时跟踪其加载进度以及动态更新标题。...

    用C#实现web代理服务器 web代理

    用C#实现web代理服务器 web服务器代理 c# web

    ios webView获取高度

    1. 页面刚加载时:在`webViewDidFinishLoad:`代理方法中,通过执行JavaScript获取页面总高度,例如上述代码所示。 2. 页面动态更新:如果页面内容是动态加载的,例如通过Ajax,那么需要监听`UIWebView`的`...

    WebView简单使用Demo

    - 在对应的Activity(如MainActivity.java)中初始化WebView,并设置其加载的URL: ```java WebView webView = findViewById(R.id.webView); webView.loadUrl("http://www.example.com"); ``` 2. **启用...

    ios-tableView嵌套webView.zip

    在cell的`awakeFromNib()`或`layoutSubviews()`方法中设置webView的frame,并确保它适应内容大小。 3. **UIWebView的使用**:在tableView的代理方法`tableView(_:didSelectRowAt:)`中,当用户点击某行时,获取对应...

    Android WebView控件的用法

    - **布局文件**:在XML布局文件中添加WebView元素,并为其设置id。 - **Java代码**:在Activity或Fragment中找到对应的WebView实例,调用`loadUrl()`方法加载网页地址,如`webView.loadUrl(...

    webview_浏览器_qt浏览器_QT_WebView_

    在IT行业中,`WebView`是一种常见且重要的组件,特别是在跨平台应用开发中。在这个场景下,我们关注的是基于Qt框架的`WebView`实现,也就是Qt浏览器。Qt是一个强大的C++库,提供了丰富的功能来构建桌面、移动甚至...

    swift-JHWebRequest使用webview发起请求

    6. **实现Webview代理方法**:你需要遵循`UIWebViewDelegate`协议,并实现相应的代理方法,以便在加载过程中获取反馈: ```swift func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { // ...

    QT通过WebView访问外部网页

    9. **调试与日志**:在开发过程中,可能需要使用`QWebInspector`进行页面元素的检查,或者设置`QWebView`的日志功能,以便跟踪加载过程和JavaScript错误。 10. **性能优化**:对于性能要求较高的应用,可以考虑使用...

Global site tag (gtag.js) - Google Analytics