J'ai quelques gros fichiers (images et vidéo) que je dois stocker dans un fournisseur de contenu. La documentation android indique ...Comment stocker de gros blobs dans un fournisseur de contenu android?
Si vous exposiez des données d'octets qui est trop grand pour mettre dans la table elle-même - comme un grand fichier bitmap - le champ qui expose les données aux clients devraient contiennent en fait un contenu: URI chaîne. C'est le champ qui donne aux clients l'accès au fichier de données. L'enregistrement doit également avoir un autre champ, nommé "_data" qui répertorie le chemin exact du fichier sur le périphérique pour ce fichier. Ce champ ne doit pas être lu par le client, mais par le ContentResolver. Le client appellera ContentResolver.openInputStream() sur le champ de l'utilisateur contenant l'URI pour l'article. Le ContentResolver sera demande le champ « _data » pour cet enregistrement , et parce qu'il a autorisations plus élevées qu'un client, il devrait pouvoir accéder à ce fichier directement et retourner une enveloppe de lecture pour le fichier au 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 le bitmap dans le contexte d'un ImageView. Considérez le code suivant quasi-code (il ne fonctionne pas) ...
ImageView iv = ....
String iconUri = cursor.getString(cursor.getColumnIndex(Table.ICON));
iv.setImageURI(Uri.parse(iconUri));
Observations/Problèmes ...
- Comment le stockées/uri récupéré reconstruire correctement? (c'est du texte dans la table)
L'implémentation de setImageURI utilise le contenu pour résoudre openInputStream, cela devrait donc 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 travail. J'ai consulté le MediaStore et le MediaProvider. Les fichiers contenant les données sont nommés en fonction du fournisseur de contenu (répertoire), du nom de la colonne, de l'identifiant de ligne et du type de média. Le résolveur de contenu acquiert alors 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;
}
Oops! J'ai répondu à ma propre question qui est "Comment stocker de gros blobs dans et fournisseur de contenu android" en éditant le texte original plutôt que d'afficher une réponse. En tout cas, la réponse courte est que vous utilisez openFile et vos amis de la manière décrite. – phreed