2010-05-25 24 views
1

Je joue avec les vignettes d'android depuis un moment et j'ai vu des incohérences qui me donnent envie de crier. Mon but est d'avoir une liste simple de toutes les images (et une liste séparée pour la vidéo) avec la vignette et le nom de fichier.Vignettes de médias Android. De graves problèmes?

Appareil: HTC Evo (frais de Google I/o)

Tout d'abord: http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html

Ce code ne semble pas fonctionner du tout, les vignettes sont dupliqués ... certains avec le " miroir "effet et certains sans. Certains ne chargeront pas et afficheront simplement un carré noir. J'ai essayé de reconstruire les vignettes en supprimant le répertoire "alblum thumbs" de la carte SD. L'application de galerie de HTC semble montrer tout bien.

Cette approche semble fonctionner:

Bitmap thumb = MediaStore.Images.Thumbnails.getThumbnail(
    getContentResolver(), 
    id, MediaStore.Video.Thumbnails.MICRO_KIND, null); 
imageView.setImageBitmap(curThumb); 

où id est l'id d'origine images et imageView est une vue de l'image. C'est bien! Mais, étrangement, beaucoup trop lent pour être utilisé dans un SimpleViewBinder. approche suivante:

String [] proj = {MediaStore.Images.Thumbnails._ID}; 
Cursor c = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
    proj, MediaStore.Images.Thumbnails.IMAGE_ID + "=" +id , 
    null, null); 

if (c != null && c.moveToFirst()) { 
    Uri thumb = Uri.withAppendedPath(mThumbUri,c.getLong(0)+""); 
    imageView.setImageURI(thumb); 
} 

Je dois expliquer que je sens le besoin où condition est nécessaire car il ne semble pas y avoir de garantie que vos uri auront le même ID pour les deux une vignette et son image mère. Cela fonctionne pour toutes les images actuelles, mais dès que je commence à ajouter des images avec l'appareil photo, elles apparaissent comme vierges! Débogage montre un redouté:

SkImageDecoder::Factory returned null 

erreur et l'URI est retourné comme non valide. Ce sont les mêmes images qui fonctionnent avec l'appel précédent. Quelqu'un peut-il soit attraper mon échec logique ou me diriger vers un code de travail?

+0

je suis allé à la première approche et a utilisé un fil pour charger réellement la vignette. L'approche d'Uri est tellement plus rapide ... c'est dommage que je ne puisse pas comprendre! – Ralphleon

Répondre

1

vous pouvez résoudre votre problème au lieu de l'interrogation MediaStore.Images.Media._ID fournisseur de contenu de vignettes

1

De mon expérience, le fournisseur de contenu des vignettes retourne un URI contenu et le chemin vers le fichier d'image, même si cette miniature a pas encore été créé. L'appel MediaStore.Images.Thumbnails.getThumbnail() va en fait créer la vignette (et la mettre là où l'URI du contenu pointe déjà) s'il n'en existe pas. Ce n'était pas clair pour moi dans la documentation mais semble être ce qui se passe.

+0

L'uri est retourné une fois que le fichier image est enregistré dans la base de données et il va juste extraire la vignette en arrière-plan. Si vous appelez MediaStore.images.thumbnails.getThumbnail() et que la vignette n'est pas encore terminée, elle essaiera d'extraire la vignette directement du fichier et non de la base de données. – artsylar

1

miniature Charger vidéo où mThumbButton est un ImageButton:

public void loadThumb(int videoId) 
    { 
     String [] proj = {MediaStore.Video.Thumbnails._ID}; 
     Cursor c = managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, 
      proj, MediaStore.Video.Thumbnails.VIDEO_ID + "=" +videoId , 
      null, null); 

     if (c != null && c.moveToFirst()) { 
      Uri thumb = Uri.withAppendedPath(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,c.getLong(0)+""); 
      mThumbButton.setImageURI(thumb); 
     } 

    }