Comment stocker de gros blobs dans un fournisseur de contenu Android?

J'ai des gros fichiers (images et vidéo) que j'ai besoin de stocker dans un fournisseur de contenu.
La android la documentation indique...

Si vous êtes exposant octet de données
trop gros pour le mettre dans le tableau lui — même -
comme un grand fichier bitmap — la
champ qui expose les données des clients
devrait vraiment contenir un contenu: URI
chaîne de caractères. C'est le champ qui donne
les clients d'accès vers le fichier de données. L'
registre il y a aussi un autre domaine,
nommé "_data" qui répertorie les exact
chemin d'accès au fichier sur le périphérique pour ce fichier.
Ce champ n'est pas destiné à être lu
par le client, mais par la
ContentResolver. Le client fera appel
ContentResolver.openInputStream() sur
l'utilisateur face du champ de la tenue de l'URI
pour l'élément. Le ContentResolver va
demande le "_data" champ
record, et parce qu'il y a de plus
d'autorisations que d'un client, il doit
être en mesure d'accéder à ce fichier directement
et le retour à une lecture de l'enveloppe pour le fichier
pour le client.
-- http://developer.android.com/guide/topics/providers/content-providers.html#creating

J'ai quelques difficultés à trouver un exemple.
En particulier, je souhaite utiliser l'image bitmap dans le contexte d'une ImageView.
Considérons le code suivant quasi-code (qui ne fonctionne pas)...

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

Observations/Problèmes...

  1. Comment puis stockées, récupérée uri sera reconstruit correctement? (c'est du texte dans la table)
  2. La setImageURI mise en œuvre permet d'utiliser le contenu de résoudre openInputStream donc cela devrait fonctionner.
    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

Je l'ai eu à travailler.
J'ai pris un indice de l'MediaStore et MediaProvider.
Les fichiers qui contiennent les données sont nommés d'après le fournisseur de contenu (répertoire), le nom de la colonne, le numéro d'identification de ligne et le type de média.
Le contenu de résolution qui acquiert le descripteur de fichier comme si...

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

...et le fournisseur de contenu répond en nature...

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

source d'informationauteur phreed