Tôi đang cố tải/tham chiếu hình ảnh từ thư mục nội dung của ứng dụng từ trong trang HTML trong WebView. Không giống như trong hầu hết các ví dụ, chính trang HTML không nằm trong thư mục nội dung nhưng được tải từ máy chủ qua http. Nền tảng của câu hỏi này là một số cải tiến hiệu suất giúp giảm thời gian tải (và lượng dữ liệu được truyền) bằng cách tải các hình ảnh tĩnh trực tiếp từ thiết bị. Tôi không chắc liệu Android có một số hạn chế ở đây hay không vì có khả năng nhất định khai thác ứng dụng bằng cách cho phép truy cập vào bộ nhớ tệp cục bộ từ một trang web được tải từ xa.Android: Cách tham chiếu hình ảnh nội dung từ trang html được tải từ xa trong chế độ xem web
Lần đầu tiên tôi cố gắng tải hình ảnh bằng cách sử dụng <img src="file:///android_asset/myimage.png">
nhưng điều này không thành công (vì lý do hiển nhiên). Nỗ lực tiếp theo của tôi là sử dụng một lớp học ContentProvider
và các hình ảnh tham khảo bằng cách sử dụng <img src="content://com.myapp.assetcontentprovider/myimage.png">
. ContentProvider này được thực hiện như sau:
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
}
Khi tải trang HTML tôi có thể nhìn thấy trong các bản ghi gỡ lỗi rằng openFile()
là thực sự được kích hoạt từ WebView và nó trả về một đối tượng ParcelFileDescriptor
hợp lệ nhưng vẫn là hình ảnh không được hiển thị. Không có thông báo lỗi nào được hiển thị trong nhật ký sẽ cho tôi biết rằng WebView đã từ chối tải/hiển thị hình ảnh. Bất kỳ ý tưởng nếu và làm thế nào điều này có thể làm việc?
Bạn đã tìm thấy câu trả lời cho câu hỏi ban đầu của mình chưa (tại sao 'tệp: //' scheme ro 'content: //' one is not working right)? – Olegas