У меня есть несколько больших файлов (изображений и видео), которые мне нужно хранить в контент-провайдере. Документация по Android указывает...
Если вы выставляете данные байта, слишком большой, чтобы положить в стол сам - таких как большой файл растрового изображения - поле, которое предоставляет данные клиентам должен содержать контент: URI строка. Это поле, которое дает клиенты получают доступ к файлу данных. запись должна также иметь другое поле, с именем "_data", в котором перечислены путь к файлу на этом файле. Это поле не предназначено для чтения клиентом, но ContentResolver. Клиент будет звонить ContentResolver.openInputStream() on поле, обращенное к пользователю, содержащее 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);
- база/основа/ядро /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;
}