关于WebView

2017-04-06  本文已影响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);
}
}

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

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;
    }
上一篇下一篇

猜你喜欢

热点阅读