Android: как ссылаться на изображения активов с удаленно загруженной html-страницы в веб-просмотре - PullRequest
10 голосов
/ 04 октября 2010

Я пытаюсь загрузить / ссылаться на изображения из папки ресурсов приложения из 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 отказывался загружать / отображать изображение.Любые идеи, если и как это могло бы работать?

Ответы [ 2 ]

6 голосов
/ 28 октября 2010

ОК, благодаря ответу mufumbo я нашел работающий хак для смешивания локальных ресурсов в удаленно загружаемых HTML-страницах. Страницы, загруженные с помощью метода loadUrl() WebView, не загружают изображения, связанные с файлом: /// 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-страницы с веб-сервера и иметь некоторые статические ресурсы, такие как изображения или таблицы стилей, загруженные из папки ресурсов приложения, чтобы повысить скорость загрузки и сохранить пропускную способность.

3 голосов
/ 21 октября 2010

Вот как я делаю в части Java:

String myHTML = "image

cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...