Получить изображение uri от picasso?

У меня есть довольно большой список URL-адресов изображений, которые я использую для загрузки ViewPager с помощью Picasso. Мне нужно предоставить возможности совместного использования этих изображений с помощью намерения (в конечном счете, с помощью ShareActionProvider). Из того, что я читал, Пикассо на самом деле не построен, чтобы обрабатывать подобные вещи из коробки, хотя он предоставляет все необходимые инструменты для этого.

Мой план перед исследованием заключался в создании простого LruCache, который использует URL-адрес в качестве значения ключа и растрового изображения. Это кэширование произойдет в onBitmapLoaded через интерфейс Picasso Target. Всякий раз, когда я хочу поделиться изображением, я проверю кеш для растрового изображения. Если этого не произойдет, я приеду с Пикассо. Теперь, когда у меня есть кэшированное растровое изображение, независимо от того, я напишу в файл (... эта часть кажется неправильной, хотя мне нужно написать файл, чтобы получить uri, не так ли?) И добавить файл uri в намерение.

Однако я вижу, что с Picasso.Builder я могу установить (и сохранить ссылку) свой собственный кеш - qaru.site/info/358139/.... Это означает, что я могу покончить с обычным Target и путаницей с правильной реализацией методов hashCode и equals для обеспечения точной утилизации, поиска и т.д.

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

Ответы

Ответ 1

Если вы хотите использовать ShareActionProvider для совместного использования изображения на текущей странице, вам не нужно сохранять свой собственный кэш изображений. Но чтобы иметь возможность передавать его другим, изображение должно находиться в общей файловой системе на устройстве.

Было бы лучше, если бы вы использовали библиотеки загрузки изображений с поддержкой пользовательского дискового кэша, например Universal Image Loader

Если вы хотите использовать Picasso (это хорошее решение).

Вам либо нужно сохранить копию изображения при каждой смене страницы, которая не является хорошим вариантом.

Или вы можете предоставить пользовательский сетевой обработчик Picasso и установить для него собственную реализацию кэша. Я бы предложил использовать OkHttp с пользовательским кешированием, в котором хранятся файлы в желаемом формате. Когда вы это делаете, у вас должна быть функция, которая преобразует URL-адреса изображений в путь к файлу на устройстве.

При каждой смене страницы, если у вас есть Fragment внутри вашего ViewPager, поместите ShareActionProvider в свои фрагменты.

Получить ссылку ShareActionProvider внутри onCreateOptionsMenu. И затем установите Intent с файлом, который вы получите.

Intent shareIntent = new Intent(Intent.ACTION_SEND);
Uri phototUri = Uri.parse(Utils.getFilePath(imageUrl));
shareIntent.setData(phototUri);
shareIntent.setType("image/png");
shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
mShareActionProvider.setShareIntent(intent);

Edit: Другой вариант, который я бы предпочел, - это вырезать ShareActionProvider и использовать для этого обычный элемент меню. Проблема с ShareActionProvider заключается в том, что вы должны сделать общий ресурс Intent готовым для совместного использования пользователем. Вы должны сделать его готовым, даже если пользователь не поделится им.

Но когда у вас есть обычная кнопка, это намного проще, потому что вы делаете операцию только тогда, когда пользователь нажимает кнопку совместного доступа. В этом случае вы можете просто запросить изображение еще раз с Picasso с помощью объекта Target и записать Bitmap, который вы получили в файл в общей внешней файловой системе, и поделиться им.