16

我有一个相当大的图像 URL 列表,用于加载ViewPager使用 Picasso 的图像。我需要能够通过意图为这些图像提供共享功能(最终通过ShareActionProvider共享)。根据我的阅读,毕加索并不是真正为开箱即用地处理这类事情而设计的,尽管它提供了所有必要的工具来做到这一点。

我在研究之前的计划是创建一个LruCache使用 url 作为键和位图值的简单程序。这种缓存将onBitmapLoaded通过毕加索的Target界面发生。每当我想共享图像时,我都会检查缓存中的位图。如果它不在那里,我会用毕加索取来。既然我有一个缓存的位图,无论如何,我将写入一个文件(......这部分看起来不正确,尽管我必须写入一个文件来获取一个 uri,对吧?)并将文件 uri 添加到意图。

但是我看到Picasso.Builder我可以设置(并保留对)我自己的缓存 - https://stackoverflow.com/a/18552559/413254。这意味着我可以通过正确实施和方法消除习惯Target和混乱,以确保准确的回收、检索等。hashCodeequals

我的问题是,毕加索如何使用这个缓存?什么是钥匙?有没有办法在不将其写入磁盘的情况下获取位图 Uri?

4

1 回答 1

1

如果您想ShareActionProvider在当前页面上共享图像,您不必保留自己的图像缓存。但是为了能够与其他人共享,图像应该在设备上的共享文件系统中。

如果您使用具有自定义磁盘缓存支持的图像加载库(如Universal Image Loader )会更好

如果您想使用毕加索(这是一个不错的决定)。

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

或者,您可以为 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);

编辑: 我更喜欢的另一个选项是为此放弃ShareActionProvider并使用普通菜单项。问题ShareActionProvider是您必须Intent事先准备好共享以供用户共享。即使用户不会共享它,您也必须准备好它。

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

于 2015-04-21T21:01:27.280 回答