Android之WebView和js交互-调用失败的看这里

前段时间项目需求在web页面中点击某个按钮,调用app中的某个功能,于是就想到了Webview和Js的交互,可是实现的时候遇到了各种问题:

下面是实现方式

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        createView(this, R.layout.activity_invite);
        mWebview = (WebView) findViewById(R.id.webview);
        webviewSettings();
    }
    /**
    * 对webView进行设置
    */
    private void webviewSettings() {
        mWebview.clearCache(true);
        synCookie(this, url);
        final WebSettings settings = mWebview.getSettings();
        settings.setSupportZoom(true);
        settings.setJavaScriptEnabled(true);//让webview支持js,必要的一步
        settings.setSupportMultipleWindows(true);
        mWebview.setSaveEnabled(false);//让webview不保存状态,实际上对调用js没有用
        /*
        *添加js和java调用的接口:最关键的方法,
        this指的是当前的activity,当然this也可以换成其他的java对象
        js2java就是当前的activity在js中的引用,可以直接通过window对象获取,
        通常情况下添加这样一个接口是非常危险的事情,
        addJavascriptInterface方法的官方文档也解释了,这个方法可能会被黑客利用,所以在某个版本之后,在js中可以通过window获取到activity对象,但是不能直接调用activity中的pulic的方法。
        只能调用activity中public而且被注解了 @JavascriptInterface的方法才能在js中被调用
        */
        mWebview.addJavascriptInterface(this, "js2java");
        /*
        *给webview添加Chrome处理器,用来处理js的对话框(比如alert等)、图标的渲染等
        */
        mWebview.setWebChromeClient(new WebChromeClient());
        //设置这个方法就是让需要加载的网页在webview里加载,而不是打开手机里的浏览器去加载
        mWebview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description,
                    String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }
        });
        mWebview.loadUrl(url);
    }

重要的事情再说一遍:
js中调用java的方法,java方法必须要加注解@JavascriptInterface:

    @JavascriptInterface
    public void javaFunction() {
        .......
    }

番外篇-WebView的Cookie处理

通常我们做项目的时候,请求自己项目的web页面都要带上cookie,如何获取httpclient中的cookie请看番外篇2;
在android中提供了CookieManager这个类,专门用于Webview的cookie处理:代码如下:

    public void synCookie(Context context, String url) {
        CookieSyncManager.createInstance(context);
        /*
        *. If this method is used before the application instantiates a WebView instance, CookieSyncManager.createInstance(Context) must be called first.
        如果这个方法在webview实例化之前使用,那么就必须使用 CookieSyncManager.createInstance(context);
        */
        CookieManager cookieManager = CookieManager.getInstance();
        //CookieManager是一个单例类,所以设置cookie的时候清理下cookie是有必要的
        cookieManager.removeAllCookie();
        cookieManager.setAcceptCookie(true);
        String cookies= PreferManager.getInstance().getString("cookies", "");
        //setCookie方法可以执行多次,也就是可以给url设置多个cookie
        cookieManager.setCookie(url, uid);
        CookieSyncManager.getInstance().sync();
    }

关于url需要注意的问题:一般的项目中dev测试环境和release预发布的测试环境是不一样的,如果两个url不一致那么cookie的设置就会失效,始终打不开界面….

番外篇2-获取HttpClient中的cookie

通常我们都知道http请求的请求头中有一个头“Set-Cookie”:保存的是请求或返回的cookie
所以当拿到HttpResponse对象后,就可以获取服务器返回的cookie用以更新本地的cookie了

private static void saveCookie(HttpResponse response) {
        Header[] headers = response.getHeaders("Set-Cookie");
        if (headers == null || headers.length == 0) {
            return;
        }
        for (Header header : headers) {
           String cookie = header.getValue();
           //然后就可以对cookie做一些判断,是不是自己需要的cookie,需不需要保存等等      
           ......                
        }
     }

你可能感兴趣的:(android)