WebView
JAVA JS 交互
Android本身自带方法
settings.setJavaScriptEnabled(true);
wvWeb.addJavascriptInterface(new CheckingDetailH5Activity.JsInterface(this), "android"); // android 是js中通过window
private class JsInterface {
private Context mContext;
public JsInterface(Context context) {
this.mContext = context;
}
//在js中调用window.android.showInfoFromJs(name),便会触发此方法。
@JavascriptInterface
public void checkingUpdate() {
EventBus.getDefault().post(new CheckingListRefreshEvent());
}
@JavascriptInterface
public void checkingDetail(String lineCodeJs, String typeJs) {
// todo something
}
}
JS中调用
windows.android.checkingUpdate()
windows.android.checkingDetail(xx, xx);
可以传对象数组
https://github.com/pengwei1024/JsBridge
webView.loadData乱码解决
webView.getSettings().setDefaultTextEncodingName("UTF -8");//设置默认为utf-8
webView.loadData(htmlData, "text/html", "UTF -8");//API提供的标准用法,无法解决乱码问题
webView.loadData(htmlData, "text/html; charset=UTF-8", null);//这种写法可以正确解码
设置cookie
/**
* 将cookie同步到WebView
* @param url WebView要加载的url
* @param cookie 要同步的cookie
* @return true 同步cookie成功,false同步cookie失败
* @Author JPH
*/
public static boolean syncCookie(String url,String cookie) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(context);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
String newCookie = cookieManager.getCookie(url);
return TextUtils.isEmpty(newCookie)?false:true;
}
// 设置cookie
public static void syncCookie(Context context) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();//移除
cookieManager.setCookie(url, cookies);//cookies是在HttpClient中获得的cookie
CookieSyncManager.getInstance().sync();
}
在android里面在调用webView.loadUrl(url)之前一句调用此方法就可以给WebView设置Cookie
注:这里一定要注意一点,在调用设置Cookie之后不能再设置
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setJavaScriptEnabled(true);
web图片适配
没有转义的情况:
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0"><style>img{max-width:80%;height:auto;}</style></head><body></body></html>
在string.xml文件中转义后的:
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0"><style>img{max-width:80%%;height:auto;}</style></head><body></body></html>
如果服务器返回的没有样式就直接替换:
htmlData = htmlData.replace("<img", "<img style='max-width:90%;height:auto;'");
Android WebView的Js对象注入漏洞解决方案
https://blog.csdn.net/t12x3456/article/details/35269723
Android WebView通过js注入Html页面
通过执行js代码反向用资源id调用本地方法
wvWeb.addJavascriptInterface(new H5Activity.JsInterface(), "app");
private class JsInterface {
public JsInterface() {
}
//在js中调用window.app.doBack(),便会触发此方法。
@JavascriptInterface
public void doBack() {
finish();
}
}
wvWeb.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
}
//转向错误时的处理
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 判断在某个页面
if (url.contains("xxx.html")) {
// android注入js
wvWeb.loadUrl("javascript:function back(){window.app.doBack();}$(\".nav-arr\").on(\"click\",function(){back();})");
}
}
});
web view cookie
WebView中CookieManager会自动管理cookie不用手动添加
web view cookie 管理
https://blog.csdn.net/tscyds/article/details/75090245
Android 5.0及以上版本使用WebView不能存储第三方Cookies解决方案
Android 5.0以上的手机使用原生WebView浏览网页,在进行登录的时候会提示验证码错误,通过查找5.0以上系统的api文档,发现5.0以上版本的webview做了较大的改动,如:同步cookie的操作已经可以自动同步、但前提是我们必须开启第三方cookie的支持。
解决方法:cookieManager.setAcceptThirdPartyCookies(webview, true);
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true);
https://stackoverflow.com/questions/38672306/cookies-are-not-working-in-an-iframe-in-android-webview
java 调js 并获取返回值
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void back() {
LogUtil.e(TAG, "back():=======");
wvWeb.evaluateJavascript("javascript:canFinish()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if (value.equals("false")) {
isBackEnd = false;
} else {
isBackEnd = true;
}
}
});
}