Android: как ссылаться на изображения объектов с удаленной загруженной страницы html в webview

Я пытаюсь загрузить/ссылаться на изображения из папки активов приложения из HTML-страницы в WebView. В отличие от большинства примеров, сама страница HTML не находится в папке с ресурсами, но загружается с сервера через http. Основой этого вопроса являются некоторые улучшения производительности, которые должны сократить время загрузки (и количество переданных данных) путем загрузки статических изображений непосредственно с устройства. Я не уверен, что у Android есть некоторые ограничения здесь, потому что есть определенная возможность использовать приложение, разрешая доступ к локальному хранилищу файлов с удаленной загруженной веб-страницы.

Сначала я попытался загрузить изображения с помощью <img src="file:///android_asset/myimage.png">, но это не удалось (по понятным причинам). Моя следующая попытка состояла в использовании класса ContentProvider и эталонных изображений с использованием <img src="content://com.myapp.assetcontentprovider/myimage.png">. Этот ContentProvider реализован следующим образом:

public class AssetContentProvider extends ContentProvider
{
private static final String URI_PREFIX = "content://com.myapp.assetcontentprovider";

public static String constructUri(String url) {
    Uri uri = Uri.parse(url);
    return uri.isAbsolute() ? url : URI_PREFIX + url;
}

@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
    Log.d("AssetContentProvider", uri.getPath());
    try {
        return getContext().getAssets().openFd(uri.getPath().substring(1)).getParcelFileDescriptor();
    } catch (IOException e) {
        Log.d("AssetContentProvider", "IOException for " + uri.getPath());
        throw new FileNotFoundException();
    }
}

// more methods irrelevant for this post
}

При загрузке HTML-страницы я могу видеть в журнале отладки, что openFile() фактически запускается из WebView и возвращает действительный объект ParcelFileDescriptor, но все же изображение не отображается. В журнале нет сообщений об ошибках, которые скажут мне, что WebView отказался загружать/отображать изображение. Любые идеи, если и как это могло бы работать?

Ответ 1

Хорошо, благодаря ответу mufumbo Теперь я нашел рабочий хак для смешивания локальных активов на удаленных загруженных HTML-страницах. Страницы, загруженные с использованием метода WebView loadUrl(), не загружают изображения, связанные с файлом:///android_asset/... В качестве обходного пути вы можете получить HTML-страницу с помощью org.apache.http.client.methods.HttpGet.HttpGet(), а затем передать ее в WebView с помощью loadDataWithBaseURL(). В этом случае WebView будет загружать ресурсы, связанные с файлом:///android_asset/, а также изображения и скрипты через HTTP. Здесь мой индивидуальный код веб-просмотра:

public class CustomWebView extends WebView {
    private String mURL;

    public void loadUrlWithAssets(final String url) {
        // copy url to member to allow inner classes accessing it
        mURL = url;

        new Thread(new Runnable() {
            public void run() {
                String html;
                try {
                    html = NetUtil.httpGETResponse(mURL);

                    // replace some file paths in html with file:///android_asset/...

                    loadDataWithBaseURL(mURL, html, "text/html", "UTF-8", "");
                }
                catch (IOException e) {
                    Log.e("CustomWebView.loadUrlWithAssets", "IOException", e);
                }
            }
        }).start();
    }
}

Обратите внимание, что вся загрузка HTTP завернута в домашний класс утилиты NetUtil.

С помощью этого класса можно отображать HTML-страницы с веб-сервера и иметь некоторые статические ресурсы, такие как изображения или таблицы стилей, загруженные из папки активов приложения, чтобы повысить скорость загрузки и сэкономить пропускную способность.

Ответ 2

Вот как я делаю на части java:

String myHTML = "< img src= \" файл:///android_asset/myimage.jpg\""; myWebView.loadDataWithBaseURL( "file:///android_asset/", myHTML, "text/html", "UTF-8", "");

веселит