Как хранить большие капли в поставщике контента Android?
У меня есть несколько больших файлов (изображения и видео), которые мне нужно хранить в контент-провайдере. Документация Android указывает ...
Если вы предоставляете байтовые данные, которые слишком велики, чтобы помещать их в саму таблицу - например, большой файл растрового изображения - поле, предоставляющее данные клиентам, должно фактически содержать строку content: URI. Это поле, которое дает клиентам доступ к файлу данных. Запись также должна иметь другое поле с именем «_data», в котором указан точный путь к файлу на устройстве для этого файла. Это поле предназначено не для чтения клиентом, а ContentResolver. Клиент вызовет ContentResolver.openInputStream () в пользовательском поле, содержащем URI для элемента. ContentResolver будет запрашивать поле «_data» для этой записи, и, поскольку он имеет более высокие разрешения, чем клиент, он должен иметь доступ к этому файлу напрямую и возвращать оболочку чтения для файла клиенту. -http://developer.android.com/guide/topics/providers/content-providers.html#creating
У меня возникли трудности с поиском примера. В частности, я хочу использовать растровое изображение в контексте ImageView. Рассмотрим следующий квази-код кода (он не работает) ...
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
Замечания / проблемы ...
Как правильно сохранить восстановленный URI? (это текст в таблице)Реализация setImageURI использует разрешение содержимого openInputStream, поэтому это должно работать.
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 / основание / ядро / Java / Android / виджет / ImageView.java
Я получил это работает. Я взял подсказку от MediaStore и MediaProvider. Файлы, содержащие данные, именуются в зависимости от поставщика контента (каталога), имени столбца, идентификатора строки и типа носителя. Средство распознавания содержимого затем получает дескриптор файла примерно так ...
Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);
... и поставщик контента отвечает тем же ...
@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;
}