Android 开发:通过 webview 将网页打包成安卓应用,kotlin 编程实践 pdf
try {
if (Build.VERSION.SDK_INT >= 16) {
Class<?> clazz = webView.getSettings().getClass();
Method method = clazz.getMethod("setAllowUniversalAccessFromFileURLs", boolean.class);
if (method != null) {
method.invoke(webView.getSettings(), true);
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//webView.loadUrl("http://172.17.1.176:8082/");//加载 url
webView.loadUrl(API);
//使用 webview 显示 html 代码
// webView.loadDataWithBaseURL(null,"<html><head><title> 欢迎您 </title></head>" +
// "<body><h2>使用 webview 显示 html 代码</h2></body></html>", "text/html" , "utf-8", null);
webView.addJavascriptInterface(this, "android");//添加 js 监听 这样 html 就能调用客户端
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
WebSettings webSettings = webView.getSettings();
/**
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: (默认)根据 cache-control 决定是否从网络上取数据。
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据。
*/
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//不使用缓存,只从网络获取数据.
webView.getSettings().setTextZoom(100);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//设置 js 可以直接打开窗口,如 window.open(),默认为 false
webView.getSettings().setJavaScriptEnabled(true);//是否允许执行 js,默认为 false。设置 true 时,会提醒可能造成 XSS 漏洞
webView.getSettings().setSupportZoom(true);//是否可以缩放,默认
webView.getSettings().setBuiltInZoomControls(true);//是否显示缩放按钮,默认 false
webView.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放。大视图模式
webView.getSettings().setLoadWithOverviewMode(true);//和 setUseWideViewPort(true)一起解决网页自适应问题
webView.getSettings().setAppCacheEnabled(true);//是否使用缓存
webView.getSettings().setDomStorageEnabled(true);//DOM Storage
}
配置 WebviewClient
//WebViewClient 主要帮助 WebView 处理各种通知、请求事件
private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {//页面加载完成
//progressBar.setVisibility(View.GONE);
}
public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面开始加载
//progressBar.setVisibility(View.VISIBLE);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Log.i("ansen", "拦截 url:" + request.getUrl());
return super.shouldOverrideUrlLoading(view, request);
}
};
//WebChromeClient 主要辅助 WebView 处理 Javascript 的对话框、网站图标、网站 title、加载进度等
private WebChromeClient webChromeClient = new WebChromeClient() {
//不支持 js 的 alert 弹窗,需要自己监听然后通过 dialog 弹窗
public boolean onJsAlert(WebView webView, String url, String message, JsResult result) {
AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext());
localBuilder.setMessage(message).setPositiveButton("确定", null);
localBuilder.setCancelable(false);
localBuilder.create().show();
//注意:
//必须要这一句代码:result.confirm()表示:
//处理结果为确定状态同时唤醒 WebCore 线程
//否则不能继续点击按钮
result.confirm();
return true;
}
//获取网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
Log.i("ansen", "网页标题:" + title);
}
//加载进度回调
@Override
public void onProgressChanged(WebView view, int newProgress) {
// progressBar.setProgress(newProgress);
}
};
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.i("ansen", "是否有上一个页面:" + webView.canGoBack());
if (webView.canGoBack() && keyCode == KeyEvent.KEYCODE_BACK) {//点击返回按钮的时候判断有没有上一页
webView.goBack(); // goBack()表示返回 webView 的上一页面
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
JS 调用 android 的方法
评论