Как получить миниатюры для изображений Picasa, выбранных из галереи? - PullRequest
2 голосов
/ 15 октября 2011

Я работаю над приложением, в котором пользователь может выбирать файлы: новое изображение с камеры, изображение из галереи или обычный старый файл. Затем отображается значок и имя для выбранного элемента. У меня это работает за одним исключением. Приложение Gallery объединяет картинки Picasaweb. Если пользователь выбирает изображение из альбома Picasa, я не смогу получить для него миниатюру.

Я использую метод MediaStore.Images.Thumbnails.getThumbnail (), и он отлично работает с другими изображениями в галерее, но для файлов picasaweb я получаю, независимо от того, какой «вид» эскиза я пытаюсь сделать чтобы получить (хотя MICRO это то, что я после):

ОШИБКА / MiniThumbFile (2051): получено исключение при чтении магии, id = 5634890756050069570, диск заполнен или монтируется только для чтения? учебный класс java.lang.IllegalArgumentException

Я заметил, что URI, заданные для выбранных файлов, отличаются. Локальные файлы изображений выглядят так:

Содержание: // СМИ / внешние / изображения / СМИ / 6912

и URL-адреса picasaweb выглядят так:

содержание: //com.android.gallery3d.provider/picasa/item/5634890756050069570

Я попытался использовать запрос для получения необработанного THUMB_DATA, используя Thumbnails.queryMiniThumbnails (), с Thumbnails.THUMB_DATA в массиве проекций, но я получил ошибку «нет такого столбца».

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

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я обнаружил, что на моем Galaxy Nexus изображения для Picassa хранятся в одном из подкаталогов в каталоге /sdcard/Android/data/com.google.android.apps.plus/cache.Если контент-провайдером является com.google.android.gallery3d.provider, тогда число после «item» в URL-адресе содержит имя изображения (в приведенном выше примере «5634890756050069570»).Эти данные соответствуют файлу в одном из подкаталогов каталога /sdcard/Android/data/com.google.android.apps.plus/cache с расширением «.screen».Если бы вы скопировали это изображение со своего телефона (в вашем случае 5634890756050069570.screen) с помощью DDMS и переименовали его с расширением «.jpeg», вы могли бы открыть его и просмотреть на своем компьютере.

Следующее onActivityResultМетод проверит, возвращается ли этот поставщик контента, а затем рекурсивно выполнит поиск файла в каталоге /sdcard/Android/data/com.google.android.apps.plus/cache.Закрытая переменная-член fileSearchPathResults заполняется методом рекурсивного поиска walkDirectoryRecursivelySearchingForFile ().

private String fileSearchPathResult = null;

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            String filePath = null;

            // This code is required to get the image path on content providers
            // on API > 10 where the image is from a picassa web album, since Google changed
            // the content provider in versions with API > 10
            if (selectedImage.toString().contains("com.google.android.gallery3d.provider")) {
                StringBuilder contentProviderPath = new StringBuilder(selectedImage.toString());
                int beginningIndex = contentProviderPath.lastIndexOf("/");
                String fileNameWithoutExt = contentProviderPath.subSequence(beginningIndex + 1,
                        contentProviderPath.length()).toString();
                Log.i(TAG, fileNameWithoutExt);
                try {
                    File path = new File("/sdcard/Android/data/com.google.android.apps.plus/cache");
                    if (path.exists() && path.isDirectory()) {
                        fileSearchPathResult = null;
                        walkDirectoryRecursivelySearchingForFile(fileNameWithoutExt, path);
                        if (fileSearchPathResult != null) {
                            filePath = fileSearchPathResult;
                        }
                    }
                } catch (Exception e) {
                    Log.i(TAG, "Picassa gallery content provider directory not found.");
                }
            }
    }


    public void walkDirectoryRecursivelySearchingForFile(String fileName, File dir) {
        String pattern = fileName;

        File listFile[] = dir.listFiles();
        if (listFile != null) {
            for (int i = 0; i < listFile.length; i++) {
                if (listFile[i].isDirectory()) {
                    walkDirectoryRecursivelySearchingForFile(fileName, listFile[i]);
                } else {
                    if (listFile[i].getName().contains(pattern)) {
                        fileSearchPathResult = listFile[i].getPath();
                    }
                }
            }
        }
    }

С помощью filePath вы можете создать растровое изображение с помощью следующего кода:

        Bitmap sourceImageBitmap = BitmapFactory.decodeFile(filePath);
0 голосов
/ 20 января 2012

ACTIVITYRESULT_CHOOSEPICTURE - это int, который вы используете при вызове startActivity (intent, requestCode);

public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    final InputStream is = context.getContentResolver().openInputStream(intent.getData());
    final Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
    is.close();
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...