I have a local html page along with several other resources pointed by it (css files and Javascript libraries) that I would like to load into a WebView . How could this be achieved ?
Perhaps not the best way to procede but I'm still experimenting.
I have a local html page along with several other resources pointed by it (css files and Javascript libraries) that I would like to load into a WebView . How could this be achieved ?
Perhaps not the best way to procede but I'm still experimenting.
The easiest way would probably be to put your web resources into the assets folder then call:
webView.loadUrl("file:///android_asset/filename.html"); For Complete Communication between Java and Webview See This
Update: The assets folder is usually the following folder: <project>/src/main/assets This can be changed in the asset folder configuration setting in your <app>.iml file as:
<option name=”ASSETS_FOLDER_RELATIVE_PATH” value=”/src/main/assets” /> See Article Where to place the assets folder in Android Studio
AndroidManifest.xml to reflect that. (Personally, I'd recommend putting the URL/file path in string resources and accessing it from there such that the path is with all the other string data for the program, but that isn't really directly related to the issue of asset/resource dependency.)probably this sample could help:
WebView lWebView = (WebView)findViewById(R.id.webView); File lFile = new File(Environment.getExternalStorageDirectory() + "<FOLDER_PATH_TO_FILE>/<FILE_NAME>"); lWebView.loadUrl("file:///" + lFile.getAbsolutePath()); In this case, using WebView#loadDataWithBaseUrl() is better than WebView#loadUrl()!
webView.loadDataWithBaseURL(url, data, "text/html", "utf-8", null); url: url/path String pointing to the directory all your JavaScript files and html links have their origin. If null, it's about:blank. data: String containing your hmtl file, read with BufferedReader for example
XML Layout File:
<WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webView" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".activities.Bani9"> </WebView> Java Code:
public class Bani9 extends AppCompatActivity { WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bani9); webView = findViewById(R.id.webView); WebSettings webSetting = webView.getSettings(); webSetting.setBuiltInZoomControls(true); webView.setWebViewClient(new WebViewClient()); webView.loadUrl("file:///android_asset/punjabi/bani9.html"); } } From the official guide https://developer.android.com/develop/ui/views/layout/webapps/load-local-content :
app/src/main/assets/WebViewAssetLoader to load the asset. Construct it in your onCreate() as follows:final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder() .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this)) .addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this)) .build(); WebViewClient to wrap WebViewAssetLoader:private static class LocalContentWebViewClient extends WebViewClientCompat { private final WebViewAssetLoader mAssetLoader; LocalContentWebViewClient(WebViewAssetLoader assetLoader) { mAssetLoader = assetLoader; } @Override @RequiresApi(21) public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return mAssetLoader.shouldInterceptRequest(request.getUrl()); } @Override @SuppressWarnings("deprecation") // to support API < 21 public WebResourceResponse shouldInterceptRequest(WebView view, String url) { return mAssetLoader.shouldInterceptRequest(Uri.parse(url)); } } This basically passes the request URL to WebViewAssetLoader to load web content from an asset.
assetLoader from (2) to construct WebViewClient from (3), and set it in your WebView. Your index.html can be loaded by using https and the default domain appassets.androidplatform.net:mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader)); mWebView.loadUrl("https://appassets.androidplatform.net/assets/index.html"); Note that loading local files using web-like URLs instead of file:// is desirable as it is compatible with the Same-Origin policy.
The Accepted Answer is not working for me, This is what works for me
WebSettings webSetting = webView.getSettings(); webSetting.setBuiltInZoomControls(true); webView1.setWebViewClient(new WebViewClient()); webView.loadUrl("file:///android_asset/index.html");