2012-05-25 5 views
1

Мне нелегко получить Thumbnails.getTumbnail для работы с фотографиями picasa на Nexus S, работающем с ICS. Все остальное, похоже, работает, включая получение исходного изображения из picasa и его отображение, но getThumbnail, похоже, не работает. Я получаю следующие ошибки при попытке использовать его:Миниатюры и подбор изображений picasa из галереи на ICS

E/MiniThumbFile(1852): Got exception when reading magic, id = 5745625138093120418, disk full or mount read-only? class java.lang.IllegalArgumentException 
W/MediaProvider( 540): original media doesn't exist or it's canceled. 

диск не заполнен, то для чтения и записи, приложение имеет внешние разрешения хранения записи, и картина действительно существует на Picasa (I можно просмотреть его через приложение Android-андроида).

Тот же код отлично работает на Android 2.3, но он следует немного по-другому, поскольку 2.3, похоже, загружает копию фотографии и передает вам фактический локальный файл: // uri для недавно загруженного изображения, а не передайте вам контент: // uri.

Это основное мясо кода в вопросе:

public void addImage(Uri uri, boolean local) 
    { 
    ContentResolver resolver = getContentResolver(); 
    Uri actualUri = uri; 

    Log.d(TAG, "addImage: original uri: " + uri.toString()); 

    if(local) { 
     try { 
      List<String> uriPath = uri.getPathSegments(); 
      String contentUri = Media.insertImage(resolver, uri.getPath(), uriPath.get(uriPath.size()-1), new String()); 
      actualUri = Uri.parse(contentUri); 
     } 
     catch(java.io.FileNotFoundException ex) { 
      Log.e(TAG, "FileNotFoundException: "); 
      ex.printStackTrace(); 
     } 
    } 

    Log.d(TAG, "addImage: actual uri: " + actualUri.toString()); 

    List<String> uriPath = actualUri.getPathSegments(); 
    long imageId = Long.parseLong(uriPath.get(uriPath.size() -1)); 

    Bitmap thumb = Thumbnails.getThumbnail(resolver, imageId, Thumbnails.MINI_KIND, null); 
    if(thumb == null) { 
     Log.e(TAG, "Failed to get thumbnail for our image."); 
     Toast toast = Toast.makeText(getApplicationContext(), "Failed to get thumbnail for image. Please try again.", Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 

    uris.add(uri); 
    bmps.add(thumb); 
    notifyDataSetChanged(); 
    } 

Этот метод вызывается, когда-либо новая фотография будет добавлена ​​в «коллекции» приложения фотографий. Когда он известен как локальный образ (т. Е. Если фотография была сделана изнутри приложения или аргумент данных atActivityResult равен null), локальный параметр имеет значение true, и я пытаюсь получить контент: // uri обратно из поэтому мы можем получить действительный идентификатор изображения, чтобы перейти к Thumbnails.getThumbnail. Этот код отлично работает для изображений, полученных из приложения Camera (через startActivityForResult), а также изображений из галереи, которые хранятся локально на устройстве.

Я немного в тупике.

+0

Лучший ответ для меня: http://stackoverflow.com/a/8936697/994324
Это работает для всех случаев (на самом деле): Picasa и локальных картинок, и это гораздо более чистой. –

+0

@ Томасу .. Спасибо, дорогая, я решил проблему с кодом примера quesion. в любом случае я хотел бы поделиться с вами своим кодом в ответ. Надеюсь, это поможет и другим. :) – swiftBoy

ответ

0

https://developers.google.com/picasa-web/docs/2.0/reference#media_group

Если у вас возникли трудное время в андроид добраться до миниатюр, обратите внимание на ссылку выше и ИПН и СМИ: группа/СМИ: тег миниатюру в кормах атома. То есть родительский элемент или контейнер эскизов, ссылающихся на in this post

Итак, для обработки больших пальцев в андроиде, если вы можете структурировать свой код, чтобы на самом деле использовать api (picasa feeds/photos/media: group и т. Д.), у вас может быть меньше проблем с ошибками, таких как настоящее.

Sample Google/Android/Picasa code

api ref

another api ref

+0

Привет, спасибо за ответ. Я не особо интересуюсь фотографиями picasa для начала в приложении, над которым я сейчас работаю, но мне хотелось бы, чтобы текущая функциональность «просто работала». К сожалению, класс Thumbnail просто не знает, как создавать эскизы изображений picasa.Я написал кучу пользовательских графических захватов, масштабирования и миниатюр (код для миниатюр - это просто код масштабирования изображения, но с особым размером с эскизом), который правильно обрабатывает показ полноразмерных фотографий (масштабированных в соответствии с максимальным размером текстуры) и эскизы с правильной ориентацией. – Tomasu

+0

В основном то, что я сделал, это извлечение изображения из picasa, а затем уменьшенное изображение. Кажется, все работает нормально. И поскольку по умолчанию я использую класс ContentResolver, этот бит обрабатывается автоматически. – Tomasu

+0

звучит хорошо. Всегда, вы можете создавать свои собственные или адаптировать и повторно использовать модули, сделанные другими. –

0

была такая же проблема, и это была проблема импорта/пакет.

Обязательно используйте правильный класс миниатюр. Есть два. Один для видео и один для изображений.

MediaStore.Images.Thumbnails 
MediaStore.Video.Thumbnails