美文网首页
关于WebView

关于WebView

作者: 苏简笔记 | 来源:发表于2017-04-06 16:14 被阅读259次

    JS与Android原生交互

    首先,webview应该先支持JS脚本

    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.addJavascriptInterface(new WebAppInterface(WebActivity.this), "Android");
    

    其次,写一个JS交互的接口,用来调用原生的方法就可以了。注意在方法前添加@JavascriptInterface

    public class WebAppInterface {
    Context mContext;
    
    /**
     * Instantiate the interface and set the context
     */
    public WebAppInterface(Context c) {
        mContext = c;
    }
    
    @JavascriptInterface
    public void openUrlWithLocalBrowser(String url) {
        Intent intent = new Intent();
        intent.setAction("android.intent.action.VIEW");
        Uri content_url = Uri.parse(url);
        intent.setData(content_url);
        mContext.startActivity(intent);
    }
    }
    
    • js调用原生方法
      onclick="Android.openUrlWithLocalBrowser(document.getElementById('pid1').innerText)">

      Android是WebView中添加JS交互的接口传进来的一个名称,相当于一个变量


    • Android原生去跟js交互
      js中约定好方法

      function replaceUrl(content){
      var nv = document.getElementById("pid1");
      nv.innerText=content;
      }

       function setImg(path){
            var imgView = document.getElementById("tip");
            imgView.src = ""+path;
       }
      

    然后在原生中去调用这个方法就可以了

    WebView拦截请求,添加token(还未测试)

    shouldInterceptRequest方法

    从 Android API 11 (3.0) 开始,WebView 开始在 WebViewClient 内提供了这样一条 API ,如下:

    public WebResourceResponse shouldInterceptRequest(WebView view, String url)  
    

    就是说只要实现 WebViewClient 的 shouldInterceptRequest 方法,然后调用 WebView 的setWebViewClient 就可以了。

    但是,在 API21 以上又弃用了上述 API,使用了一条新的 API,如下:

    public WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request)
    

    具体实现:

    /**
         * 从api21开始生效
         * @param webView
         * @param webResourceRequest
         * @return
         */
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
            Uri uri = webResourceRequest.getUrl();
            if (uri != null) {
                return getWebResourceResponse(uri.toString());
            }
            return super.shouldInterceptRequest(webView, webResourceRequest);
        }
    
        /**
         * 拦截Url,可替换,按照自己的规则去拼接Url,从api3.0开始有效,但从21起开始失效
         * @param webView
         * @param urlStr
         * @return
         */
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webView, String urlStr) {
            return getWebResourceResponse(urlStr);
        }
    
        @Nullable
        private WebResourceResponse getWebResourceResponse(String urlStr) {
            try {
                AccountBean user = UserUtil.getInstance().getUser();
                if (user == null) {
                    return null;
                }
                URL url = new URL(urlStr);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                String token = user.getToken();
                CookieManager cookieManager = CookieManager.getInstance();
                String cookie = cookieManager.getCookie(url.getHost());
                urlConnection.setDoOutput(true);//http正文内,需要设置true,默认是false
                urlConnection.setDoInput(true);//设置是否从httpUrlConnection读入,默认情况下是true;
                urlConnection.setUseCaches(false);//是否使用缓存,put请求不能使用缓存
                urlConnection.setRequestProperty("Content-Type", "application/json");//设定 请求格式 json,也可以设定xml格式
                urlConnection.setRequestProperty("Cookie", cookie);
    
                urlConnection.setRequestMethod("GET");
                urlConnection.addRequestProperty("Authorization", "Bearer " + token);
    
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    
                String data = new Scanner(in).useDelimiter("\\A").next();
                System.out.println("Data:" + data);
    
                urlConnection.getContentType();
                urlConnection.getContentEncoding();
                urlConnection.getContentEncoding();
                urlConnection.disconnect();
                return new WebResourceResponse("text/html", "UTF-8", in);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    };
    

    webView添加Token的第二种方法(还未测试)

     public boolean shouldOverrideUrlLoading(WebView view, String url) {
            mIsOutLink = false;
            //添加token
            Map extraHeaders = new HashMap();
            extraHeaders.put("x-auth-token", “token”);
            view.loadUrl(url, extraHeaders);
            return true;
        }

    相关文章

      网友评论

          本文标题:关于WebView

          本文链接:https://www.haomeiwen.com/subject/dtrqattx.html