android 原生和js之间的交互更好实现功能;以下主要针对webview的配置进行论述:
一、webview的配置:
//开启js脚本支持
WebSettings settings = getSettings();
settings.setJavaScriptEnabled(true);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
//适配手机大小
settings.setUseWideViewPort(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
settings.setLoadWithOverviewMode(true);
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setGeolocationEnabled(true);
String dir = context.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
settings.setGeolocationDatabasePath(dir);
// enable Web Storage: localStorage, sessionStorage
settings.setDomStorageEnabled(true);
// 设置 缓存模式
// s.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// 设置 缓存模式
settings.setAppCacheMaxSize(1024 * 1024 * 15);// 设置缓冲大小,我设的是15M
String cacheDirPath = context.getFilesDir().getAbsolutePath() + "cache/";
settings.setAppCachePath(cacheDirPath);
// 开启 Application Caches 功能
settings.setAppCacheEnabled(true);
// 设置 Application Caches 缓存目录
settings.setAppCachePath(cacheDirPath);
settings.setAllowFileAccess(true);
// 触摸焦点起作用
requestFocus();
setWebChromeClient(new WVChromeClient());
setWebViewClient(new WVClient());
二、调用
1、js调用原生方法:
//注意后面的android是和h5约定好的,他调用是window.android.xxxMethod();
mBinding.h5WebView.addJavascriptInterface(new JsObject(), "android");
class JsObject {
//此方法并不在主线程,所以在此方法不能更新UI,可以使用Handler处理
@JavascriptInterface
public void pageJump(String params) {//js调用window.android.pageJump("hh")
//注意调用参数必须一致,要是传string就让js转化下如:JSON.stringify(user)
}
}
2、加载h5链接、调用h5方法
1、加载assets文件夹中的资源:
h5Webview.loadUrl("file:///android_asset/scene_home/index.html");
2、加载手机内存中的资源:
h5Webview.loadUrl("file:///" +“文件的详细路径”);
3、直接加载url:h5Webview.loadUrl(url);
4、调用h5的方法:
第一种://只调用不需要返回值
h5WebView.loadUrl("javascript:getAppApp()");
第二种:通过调用js方法,js直接return返回移动端需要的值,此方法需要4.4以上才支持
h5WebView.evaluateJavascript("javascript:getAppApp()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e("zyt", "onReceiveValue==" + value);
//此处为 js 返回的结果
}
});
3、原生按返回webview的返回情况
//h5是否可以返回
h5WebView.canGoBack()
//调用h5返回上一页面
h5WebView.goBack()
//获取当前h5页面是打开的第几个h5页面 //第一个页面为index为0
WebBackForwardList backForwardList = h5WebView.copyBackForwardList();
int currentIndex = backForwardList.getCurrentIndex();
//判断是否可以返回或前进到指定页面
h5WebView.canGoBackOrForward(index);
//返回或者前进到index页面 index相对当前也页面为0传值,向前为正,向后为负;如前进一页index为1 后退一页index为 -1
h5WebView.goBackOrForward(index);
三、webview和js使用中遇到的一些问题
1、忽略https的证书问题===一些https的链接不能打开
private class WVClient extends WebViewClient {
@Override
public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
super.onReceivedSslError(webView, sslErrorHandler, sslError);
//https忽略证书问题
sslErrorHandler.proceed();
}
}
2、改变webview的内核信息
//xxx_android 是和h5约定好的
s.setUserAgentString(s.getUserAgentString() + ";xxx_android");
3、Webview 加载一些链接出现白板现象
webView.getSettings().setDomStorageEnabled(true);
还有一种是加载https的URL时在5.0以上加载不了,5.0以下可以加载,这种情况可能是网页中存在非https得资源,在5.0以上是默认关闭,需要设置,
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
4、Android Webview加载h5播放视频或音频时,退出Activity 后,还有播放声音的解决方法
注意:是h5WebView.reload();有效,onResume和onPause方法要都使用,只用onPause方法会出现锁屏再回来h5的点击事件、滑动无效
@Override
protected void onResume() {
super.onResume();
h5WebView.onResume();
}
@Override
protected void onPause() {
super.onPause();
h5WebView.reload();
h5WebView.onPause();
}
@Override
protected void onDestroy() {
//销毁
h5WebView.clearCache(true);
h5WebView.clearFormData();
h5WebView.destroy();
h5WebView = null;
super.onDestroy();
}
5、Android原生图片转化为base64传给js(h5显示图片),要传格式,否则方法都不会调用:
//imgPlugin这是h5加载图片的方法
getWebView().loadUrl("javascript:imgPlugin('data:image/png;base64," + base64PicPathString + "')");
6、设置cookie
/**
* 同步webView的cookie信息----多个数据需要一个一个去设置,不可以使用setcookie(url,"cookie01;cookie02");这样只能获得第一个
*
* @param context
* @param url
*/
public static void synCookies(Context context, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
//添加cookie====注意多个cookie需要分别设置
cookieManager.setCookie(url, "cookie01");
cookieManager.setCookie(url, "cookie02");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.flush();
} else {
CookieSyncManager.getInstance().sync();
}
}
7、清除cookie信息
//移除cookie信息
CookieSyncManager.createInstance(APPApplication.getInstance());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
8、给h5链接添加请求头
Map<String,String> map=new HashMap<>();
map.put("1", "23");
webview.loadUrl(s,map);
9、调用js方法时传字符串调用失败,仿照如下代码(注意单引号)
webview.loadUrl("javascript:setMessage('" + content + "')");
10、webview加载html代码:
String msg ="<html>在模拟器 2.1 上测试</html>";
tbsWebview.loadData(msg, "text/html", "UTF-8");
11、有些手机加载html代码显示乱码:
将方法
tbsWebview.loadData(htmlCode, "text/html", "UTF-8");
改为:
tbsWebview.loadDataWithBaseURL(null, htmlCode, "text/html", "UTF-8", null);
常用的和常遇到的问题都记录在此了,后面遇到新问题会补上的。