WebView の HTML ページ内からアプリのアセット フォルダーから画像を読み込んで参照しようとしています。ほとんどの例とは異なり、HTML ページ自体は assets フォルダーにはありませんが、http 経由でサーバーから読み込まれます。この質問の背景には、デバイスから直接静止画像をロードすることにより、ロード時間 (および転送されるデータの量) を削減するパフォーマンスの改善があります。リモートで読み込まれた Web ページからローカル ファイル ストレージへのアクセスを許可することでアプリを悪用する可能性があるため、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 が画像の読み込み/表示を拒否したことを示すエラー メッセージはログに表示されません。これが機能するかどうか、またどのように機能するかについてのアイデアはありますか?