Android 2.2 GetThumbnail возвращает неверное растровое изображение - PullRequest
2 голосов
/ 29 сентября 2010

Я использую метод MediaStore.Video.Thumbnails.getThumbnail() для извлечения миниатюр для файлов, которые отображаются в списке.Это хорошо работает для начала, но через некоторое время я получаю не те эскизы, которые соответствуют файлу.Как только GetThumbnail() начинает давать сбой, кажется, он снова и снова возвращает только одно и то же растровое изображение, независимо от того, какой файл я пробую.Это происходит на моем HTC Desire, работающем под управлением Android 2.2, и его очень сложно воспроизвести - через некоторое время это начнет происходить.

Вот (сокращенная версия) мой исходный код:

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

Я также делаю то же самое для загрузки миниатюр видео.Я использовал некоторый отладочный код для проверки значений, возвращаемых GetImageID (), и я почти уверен, что они верны.

Может кто-нибудь увидеть, что я могу делать неправильно?Или знаете причину, по которой миниатюры перестают правильно генерироваться через некоторое время?

1 Ответ

0 голосов
/ 29 сентября 2010

Хм, в вашем запросе есть "лайк", а у вас только один ". Кроме того, вы не защищаете свой запрос от внедрения SQL!

Я бы порекомендовал запрос, подобный этому:

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);

Может быть, это уже было проблемой.

...