¿Cómo almacenar grandes blobs en un proveedor de contenido de Android?

Tengo algunos archivos grandes (imágenes y video) que necesito almacenar en un proveedor de contenido. La documentación de Android indica ...

Si está exponiendo datos de bytes que son demasiado grandes para ponerlos en la tabla misma, como un archivo de mapa de bits grande, el campo que expone los datos a los clientes debería contener un contenido: cadena URI. Este es el campo que brinda a los clientes acceso al archivo de datos. El registro también debe tener otro campo, llamado "_data" que enumera la ruta exacta del archivo en el dispositivo para ese archivo. Este campo no está destinado a ser leído por el cliente, sino por ContentResolver. El cliente llamará a ContentResolver.openInputStream () en el campo orientado al usuario que contiene el URI para el elemento. ContentResolver solicitará el campo "_data" para ese registro, y debido a que tiene permisos más altos que un cliente, debería poder acceder a ese archivo directamente y devolver un contenedor de lectura para el archivo al cliente. -http://developer.android.com/guide/topics/providers/content-providers.html#creating

Tengo algunas dificultades para encontrar un ejemplo. En particular, deseo utilizar el mapa de bits en el contexto de un ImageView. Considere el siguiente código cuasi-código (no funciona) ...

ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));

Observaciones / Problemas ...

¿Cómo se puede reconstruir correctamente la uri almacenada / recuperada? (es texto en la tabla)

La implementación de setImageURI hace uso de la resolución de contenido openInputStream, por lo que esto debería funcionar.

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 / base / core / java / android / widget / ImageView.java

Lo tengo funcionando. Tomé una pista de MediaStore y MediaProvider. Los archivos que contienen los datos se nombran en función del proveedor de contenido (directorio), el nombre de la columna, la identificación de la fila y el tipo de medio. El solucionador de contenido adquiere el descriptor de archivo de esta manera ...

Uri iconUri = Uri.withAppendedPath(Table.getUri(cursor), Table.ICON);
ib.setImageURI(iconUri);

... y el proveedor de contenido responde en especie ...

@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;
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta