在 Android WebView 中加載 assets 目錄下的 HTML 文件,需使用標準 file:///android_asset/ 協議路徑,注意三個斜杠且區分大小寫。
// 正確:三個斜杠,android_asset 全小寫
webView.loadUrl("file:///android_asset/faq.htm");
// 目錄下文件
webView.loadUrl("file:///android_asset/folderName/index.html");
// 錯誤示例:
// file://android_asset/faq.htm (缺少一個斜杠)
// file:///android_asset//faq.htm (雙斜杠)
// file:///Android_Asset/faq.htm (大小寫錯誤)
WebView webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true); // 通常需要
settings.setDomStorageEnabled(true); // HTML5 本地存儲
settings.setAllowFileAccess(true); // 允許訪問文件
settings.setAllowContentAccess(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 頁面加載完成回調
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// 錯誤處理:顯示友好頁面
view.loadUrl("file:///android_asset/error.html");
}
});
webView.loadUrl("file:///android_asset/faq.htm");
app/
└── src/
└── main/
└── assets/
├── faq.htm
├── css/
│ └── style.css
├── js/
│ └── main.js
└── folderName/
└── index.html
| 現象 | 原因 | 解決 |
|---|---|---|
| 白屏/無內容 | 路徑錯誤、JS 錯誤阻塞 | 檢查路徑、開啟 JS、查看 logcat |
| CSS/JS 不生效 | HTML 中引用路徑錯誤 | 使用相對路徑、確認 assets 目錄結構 |
| 圖片不顯示 | 路徑大小寫、文件缺失 | Linux 區分大小寫、確認文件存在 |
| 無法訪問本地文件 | setAllowFileAccess(false) | 設置 true、API 29+ 需 setAllowFileAccessFromFileURLs |
// 現代安全方式,支援 HTTP(s) 模擬、CSP、混合內容
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
.build();
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return assetLoader.shouldInterceptRequest(request.getUrl());
}
});
webView.loadUrl("https://appassets.androidplatform.net/assets/faq.htm");
// 使用虛擬域名訪問 assets,更安全、支援現代 Web 標準
assets 目錄文件打包進 APK,只讀,運行時不可修改assets 訪問setMixedContentMode