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;
}
网友评论