Как хранить большие капли в поставщике контента 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;
}

Ответы на вопрос(3)

Ваш ответ на вопрос