2010-09-29 8 views
2

J'utilise la méthode MediaStore.Video.Thumbnails.getThumbnail() à chercher les vignettes pour les fichiers que je montre dans une liste. Cela fonctionne bien pour commencer, mais après un certain temps, les vignettes que je récupère ne sont pas celles qui correspondent au fichier. Une fois que GetThumbnail() commence échouant il semble retourner seulement la même bitmap encore et encore, indépendamment du fichier que j'essaye. Cela se produit sur mon HTC Desire, fonctionnant sous Android 2.2, et est très difficile à reproduire - il commencera juste à se produire après un certain temps.Android 2.2 GetThumbnail renvoie incorrect Bitmap

Voici (une version réduit de) mon code source:

static public Bitmap GetThumbnailForFile(File p_File, Activity 
p_activity) 
{ 
    long imageID = GetImageID(p_File, p_activity); 
    if (imageID < 0) 
    { 
     return null; 
    } 
    return 
MediaStore.Images.Thumbnails.getThumbnail(p_activity.getContentResolver(), 
imageID, Thumbnails.MICRO_KIND, null); 
} 

public static long GetImageID(File p_File, Activity p_activity) 
{ 
    long result =-1; 
    Cursor c = 
p_activity.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
     new String[]{MediaStore.Images.Media._ID +""}, 
     MediaStore.Images.Media.DATA +" like '" + p_File.getAbsolutePath(), 
     null, null); 
    c.moveToNext(); 
    if (!c.isAfterLast()) 
    { 
     result = c.getLong(0); 
    } 
    c.close(); 
    return result; 
} 

Je fais aussi la même chose pour charger des vignettes vidéo. J'ai utilisé du code de débogage pour inspecter les valeurs retournées par GetImageID(), et je suis assez sûr qu'elles sont correctes. Est-ce que quelqu'un peut voir ce que je peux faire mal? Ou connaissez-vous une raison pour laquelle les vignettes cessent d'être correctement générées après un certain temps?

Répondre

0

Hmm, votre requête contient un 'like', et vous n'en avez qu'un '. De plus, vous ne protégez pas votre requête contre l'injection SQL!

Je recommande une requête comme ceci:

p_activity.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
    new String[]{ MediaStore.Images.Media._ID +"" }, 
    MediaStore.Images.Media.DATA + "=?", 
    new String[]{ p_File.getAbsolutePath() }, 
    null); 

Peut-être était déjà le problème.

+0

Merci pour votre réponse! J'avais du code là-bas pour protéger l'injection SQL contre le remplacement des caractères avec leurs équivalents échappés. C'était un peu en désordre donc je l 'ai sorti pour simplifier le code ici - On dirait que j'ai sorti un des. La façon dont vous avez utilisé ici est préférable, donc je vais changer mon code pour le faire. Je ne pense pas que cela va résoudre mon problème, car il semblait toujours que l'ID revenait correctement. – Auber