mWebSettings = mWebView01.getSettings(); // 是否启用Application缓存 mWebSettings.setAppCacheEnabled(true); // 是否启用数据库、存放缓存、地标权限等 mWebSettings.setDatabaseEnabled(true); // 启用数据库缓存的存放路径 mWebSettings.setDatabasePath("/data/data/com.package.name/databases");
1 2 3 | mWebView.setWebViewClient( new ThroughClient()); mWebView.setWebChromeClient( new ThroughChromeClient()); mWebView.addJavascriptInterface( this , "meilishe" ); |
ThroughClient
class ThroughClient extends WebViewClient { // 打开网页时调用本webview @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("tel:")) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; } view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } }
ThroughChromeClient
class ThroughChromeClient extends WebChromeClient { // 更新进度条 @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { mPBar.setProgress(100); mPBar.setVisibility(View.GONE); } else { if (mPBar.getVisibility() != View.VISIBLE) { mPBar.setVisibility(View.VISIBLE); } mPBar.setProgress(newProgress); } super.onProgressChanged(view, newProgress); } class DismissListener implements DialogInterface.OnDismissListener { JsResult result; DismissListener(final JsResult result) { this.result = result; } @Override public void onDismiss(DialogInterface dialog) { result.cancel(); } } @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(mContext) .setOnDismissListener(new DismissListener(result)) .setTitle("来自星星的提示") .setMessage(message) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 处理结果为确定状态 同时唤醒WebCore线程 result.confirm(); } }).show(); return true; // 已处理 } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(mContext) .setOnDismissListener(new DismissListener(result)) .setTitle("confirm") .setMessage(message) .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Toast.makeText(mContext, "you clicked yes",0).show(); ToastTools.show(mContext, "you clicked yes",0); result.confirm(); } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 处理结果为取消状态 同时唤醒WebCore线程 result.cancel(); } }).create().show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { // defaultValue 默认值 // message 消息内容 new AlertDialog.Builder(mContext) .setOnDismissListener(new DismissListener(result)) .setTitle("prompt") .setPositiveButton("YES", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 记录结果 result.confirm("返回结果"); } }) .setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).create().show(); return true; } }
截图WebView加载的图片
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url){
/* 撷取画面 */
Picture picture = view.capturePicture();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/* 取得宽和高 */
int width = picture.getWidth();
int height = picture.getHeight();
if (width > 0 && height > 0){
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
picture.draw(canvas);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
FileOutputStream fos = null;
try{
fos = new FileOutputStream("/sdcard/EXtemp"
+ System.currentTimeMillis() + ".jpg");
if (fos != null){
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(view.getContext(), "Snapshot OK", Toast.LENGTH_SHORT)
.show();
}
super.onPageFinished(view, url);
}
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!