Tôi có một số tệp lớn (hình ảnh và video) mà tôi cần lưu trữ trong nhà cung cấp nội dung. Các tài liệu android chỉ ...Làm cách nào để lưu trữ các đốm màu lớn trong nhà cung cấp nội dung android?
Nếu bạn đang phơi bày dữ liệu byte đó là quá lớn để đưa vào bảng riêng của mình - như một file bitmap lớn - các lĩnh vực đó cho thấy nhiều dữ liệu cho khách hàng nên thực sự chứa nội dung: URI chuỗi. Đây là trường cung cấp cho khách hàng truy cập vào tệp dữ liệu. Bản ghi cũng phải có một trường khác, có tên "_data" liệt kê chính xác đường dẫn tệp trên thiết bị cho tệp đó. Trường này không được đọc bởi khách hàng , nhưng theo số Trình phân giải nội dung. Khách hàng sẽ gọi số ContentResolver.openInputStream() trên trường hướng đến người dùng đang giữ URI cho mặt hàng đó. ContentResolver sẽ yêu cầu trường "_data" cho bản ghi và vì nó có quyền cao hơn so với khách hàng, nên có thể truy cập tệp đó trực tiếp và trả lại tệp đính kèm cho tệp cho khách hàng. - http://developer.android.com/guide/topics/providers/content-providers.html#creating
Tôi gặp khó khăn khi tìm một ví dụ. Cụ thể là tôi muốn sử dụng bitmap trong ngữ cảnh một ImageView. Xem xét các mã bán đoạn mã sau (nó không hoạt động) ...
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
Quan sát/vấn đề ...
- Làm thế nào có thể lưu trữ/thu hồi uri được tái tạo một cách chính xác? (đó là văn bản trong bảng)
Việc triển khai setImageURI làm cho việc sử dụng nội dung giải quyết openInputStream để điều này có hiệu quả.
String scheme = mUri.getScheme(); ... } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme)) { try { d = Drawable.createFromStream( mContext.getContentResolver().openInputStream(mUri), null);
--frameworks/cơ sở/lõi/java/android/widget/ImageView.java
tôi nhận nó làm việc. Tôi lấy một gợi ý từ MediaStore và MediaProvider. Các tệp có chứa dữ liệu được đặt tên dựa trên nhà cung cấp nội dung (thư mục), tên cột, id hàng và loại phương tiện. Các phân giải nội dung sau đó mua lại các bộ mô tả tập tin như vậy ...
Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
... và các nhà cung cấp nội dung trả lời bằng hiện vật ...
@Override
public ParcelFileDescriptor openFile (Uri uri, String mode) {
int imode = 0;
if (mode.contains("w")) imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if (mode.contains("r")) imode |= ParcelFileDescriptor.MODE_READ_ONLY;
if (mode.contains("+")) imode |= ParcelFileDescriptor.MODE_APPEND;
List<String> pseg = uri.getPathSegments();
if (pseg.size() < 3) return null;
try {
File filePath = filePathFromRecord(pseg.get(2), pseg.get(1));
return ParcelFileDescriptor.open(filePath, imode);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
Oops! Tôi trả lời câu hỏi của riêng tôi đó là "Làm thế nào để lưu trữ các đốm lớn trong và nhà cung cấp nội dung Android" bằng cách chỉnh sửa văn bản gốc hơn là đăng câu trả lời. Trong mọi trường hợp, câu trả lời ngắn gọn là bạn sử dụng openFile và bạn bè theo cách được mô tả. – phreed