Загрузка существующего файла .html с помощью Android WebView

Я пробовал образцы, демонстрации из кодов Google и других ресурсов с WebView, но когда я пытаюсь сделать это в своем собственном коде, у меня это не работает.

Я хочу загрузить myfile.html, который я поместил в папку с ресурсами, и используя:

private WebView myWebView;

myWebView.loadUrl("file:///android_assets/myfile.html");

На эмуляторе показывает ошибку

Веб-страница file:///android_assets/myfile.html не может быть загружена, так как: Запрошенный файл не найден. /android_assets/myfile.html

Когда я помещаю этот файл в папку res/raw/ и использую:

myWebView.loadUrl("file:///android_res/raw/myfile.html");

тогда только эмулятор Android 2.2 API уровня 8 может загрузить файл, вероятно, другие более старые версии показывают ту же ошибку. Я что-то упускаю?

Есть ли способ загрузить существующий файл .html в пакет приложения, который работает во всех версиях API?


person laph    schedule 26.10.2010    source источник


Ответы (6)


хорошо, это была моя очень глупая ошибка. Я публикую ответ здесь на случай, если у кого-то возникнет такая же проблема.

Правильный путь для файлов, хранящихся в папке ресурсов, — file:///android_asset/* (без буквы «s» для папки ресурсов, о которой я всегда думал, что она должна иметь «s»).

И mWebView.loadUrl("file:///android_asset/myfile.html"); работает на всех уровнях API.

Я до сих пор не понимаю, почему mWebView.loadUrl("file:///android_res/raw/myfile.html"); работает только на уровне API 8. Но сейчас это не имеет значения.

person laph    schedule 27.10.2010
comment
FWIW Я не думаю, что это была глупая ошибка. Я сделал одну и ту же ошибку дважды. Это не интуитивно! Сначала создайте папку с именем assets, а затем обратитесь к ней с помощью android_asset (без s)?? Это глупая платформа, имхо :P - person richtaur; 12.01.2011
comment
плохо raw не получилось. Я бы использовал raw-de, raw-frи так далее. Теперь я должен сделать это сам. - person Martin; 27.06.2011
comment
я пробовал так же, руководствуясь laph, но когда я помещал свой xml-файл в указанную вами папку, myWebView.loadUrl(file:///android_res/raw/myfile.xml); Это дает мне ошибку: убедитесь, что Интернет или путь правильный, и когда я пишу myWebView.loadUrl(file://android_res/raw/myfile.xml); он не дает никаких ошибок, но и ничего не показывает. Пожалуйста, помогите мне в этом. - person Aditya1510; 16.11.2011
comment
Привет Адитья, я считаю, что ошибка связана с тем, что ваш файл .xml. loadUrl предполагает загрузку файла .html. Пожалуйста, поправьте меня, если я ошибаюсь. - person laph; 29.11.2011
comment
Это возможно? Активы папки содержат файлы Javascript и другие файлы, папка res/raw содержит файлы HTML. - person user2422690; 12.10.2016
comment
Похоже, это не работает для локализованных ресурсов, как указал @martin. Кто-нибудь знает, с чего начать? Мне нужно показать 3 языка и иметь все файлы file-en.html, file-es.html и file-de.html. - person coya; 04.09.2017
comment
Чтобы использовать необработанную папку, используйте android_res/raw/. Подробнее здесь: stackoverflow.com/a/14171362/753632 - person AndroidDev; 29.09.2019

Если ваша структура должна быть такой:

/assets/html/index.html

/assets/scripts/index.js

/assets/css/index.css

Затем просто выполните ( Android WebView: обработка изменений ориентации )

    if(WebViewStateHolder.INSTANCE.getBundle() == null) { //this works only on single instance of webview, use a map with TAG if you need more
        webView.loadUrl("file:///android_asset/html/index.html");
    } else {
        webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
    }

Убедитесь, что вы добавили

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
    }

Тогда просто используйте URL

<html>
<head>
    <meta charset="utf-8">
    <title>Zzzz</title>
    <script src="../scripts/index.js"></script>
    <link rel="stylesheet" type="text/css" href="../css/index.css">
person EpicPandaForce    schedule 16.04.2015

вставьте файл .html в папку активов папки вашего проекта. и создайте файл xml в папке макета с следующим кодом: my.xml:

<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
    />

добавить фол код в активность

setContentView(R.layout.my);
    WebView mWebView = null;
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl("file:///android_asset/new.html"); //new.html is html file name.
person Naresh    schedule 22.12.2010

Скопируйте и вставьте свой файл .html в папку ресурсов вашего проекта и добавьте приведенный ниже код в свою активность onCreate().

        WebView view = new WebView(this);
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl("file:///android_asset/**YOUR FILE NAME**.html");
        view.setBackgroundColor(Color.TRANSPARENT);
        setContentView(view);
person Arunkumar    schedule 19.08.2014
comment
меня зацепил тройной слэш /// - person Marc; 29.03.2019

Вы можете прочитать html-файл вручную, а затем использовать методы loadData или loadDataWithBaseUrl WebView, чтобы отобразить его.

person Lachezar    schedule 26.10.2010
comment
Привет Лучо, спасибо за ваш ответ. Вы имеете в виду, что мне нужно преобразовать мой файл .html в строку, а затем загрузить его с помощью метода loadData или loadDataWithBaseUrl? - person laph; 27.10.2010
comment
мои файлы .html довольно большие, чтобы быстро преобразовать их в строку. Любая идея загрузить его с абсолютным путем? - person laph; 27.10.2010

Отладочная компиляция отличается от релизной, поэтому:

Рассмотрите структуру файла вашего проекта следующим образом [этот случай, если для сборки отладки]:

src
  |
  debug
      |
      assets
           |
           index.html

Вы должны вызвать index.html в свой WebView, например:

web.loadUrl("file:///android_asset/index.html");

Итак, для сборки релиза это должно быть так:

src
  |
  release
        |
        assets
             |
             index.html

Следующая структура также работает, для обеих компиляций [отладка и выпуск]:

src
  |
  main
     |
     assets
          |
          index.html
person PYK    schedule 06.06.2018