从毕加索获得图像uri?

时间:2014-02-11 05:13:07

标签: android caching bitmap shareactionprovider picasso

我有一个相当大的图片网址列表,我用它来使用Picasso加载ViewPager。我需要能够通过意图为这些图像提供共享功能(最终通过ShareActionProvider共享)。从我所读过的内容来看,毕加索并不是真正能够开箱即用来处理这类事情的,尽管它提供了所有必要的工具。

我在研究之前的计划是创建一个简单的LruCache,它使用url作为键和位图值。此缓存将通过Picasso的onBitmapLoaded界面在Target中进行。每当我想要共享图像时,我都会检查缓存中的位图。如果它不在那里,我会和Picasso一起取。既然我有一个缓存的位图,我会写一个文件(......这部分看起来不对,但我必须写一个文件来获取一个uri,对吗?)并添加文件uri到意图。

但是我看到使用Picasso.Builder我可以设置(并保留对我自己的缓存的引用)https://stackoverflow.com/a/18552559/413254。这意味着我可以取消自定义Target并混淆正确实施hashCodeequals方法,以确保准确回收,检索等。

我的问题是,毕加索如何使用这个缓存?有什么关键?有没有办法获得位图Uri而不将其写入磁盘?

1 个答案:

答案 0 :(得分:0)

如果您想使用ShareActionProvider在当前页面上共享图像,则无需保留自己的图像缓存。但是为了能够将其共享给其他人,图像应该位于设备上的共享文件系统中。

如果将图像加载库与Universal Image Loader

等自定义磁盘缓存支持一起使用会更好

如果你想使用毕加索(这是一个很好的决定)。

您必须在每次更改页面时保存图像副本,这也不是一个好选择。

或者您可以为Picasso提供自定义网络处理程序并为其设置自定义缓存实现。我建议使用OkHttp自定义缓存,以您希望的格式存储文件。执行此操作时,您必须具有将图像URL转换为设备上的文件路径的功能。

在每次更改页面时,如果Fragment中有ViewPager,请将ShareActionProvider放入您的片段中。

获取ShareActionProvideronCreateOptionsMenu的引用。然后使用您获得的文件路径设置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);

修改 我更喜欢的另一个选择是抛弃ShareActionProvider并使用普通的菜单项。 ShareActionProvider的问题在于您必须让共享Intent准备好供用户预先共享。你必须做好准备,即使用户不会分享它。

但是当你有一个普通按钮时,它会更容易,因为你只在用户点击分享按钮时才进行操作。在这种情况下,您只需从Picasso使用Target对象再次请求图像,并将您获得的Bitmap写入共享外部文件系统中的文件并共享。