208

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.

2
  • for me it worked if I dropped the dot html -webView.loadUrl("file:///android_asset/filename"); Commented Feb 19, 2015 at 14:29
  • 5
    Any reason why you don't want to accept @Joe's answer? Commented Sep 15, 2018 at 5:49

6 Answers 6

376

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

Sign up to request clarification or add additional context in comments.

11 Comments

This problem is really an FAQ.
You could presumably also load it form a String if you're very adverse to using assets...(see stackoverflow.com/questions/4543349/load-local-html-in-webview)
This should be marked as correct answer, `cause it really is.
@SK9 The same applies if any other asset or expected file is missing, like if you change the name of your starting activity class and don't update 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.)
For those don't know how to create assets folder, right click on "app"->"New"->"Folder"->"Assets Folder", and click "Finish". Android Studio will create the assets folder in correct path. And you just need to move your html file to the new assets folder. Reference: stackoverflow.com/questions/18302603/…
|
30

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()); 

2 Comments

in the example there that have the html in external memory, it is best to have it packaged within the application
"file:///" is important when using HTML file from local device directory. Thanks
5

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

More info: WebView.loadDataWithBaseURL(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)

1 Comment

What is data variable? Please provide an example.
1

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"); } } 

Make sure you set file path accurately. Make sure you set File Path properly

Comments

1

From the official guide https://developer.android.com/develop/ui/views/layout/webapps/load-local-content :

  1. Store the HTML as an asset in app/src/main/assets/
  2. Use 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(); 
  1. Subclass 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.

  1. Use 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.

Comments

0

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"); 

1 Comment

Whats is the version of your Mobile?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.