我有一个相当大的图片网址列表,我用它来使用Picasso加载ViewPager
。我需要能够通过意图为这些图像提供共享功能(最终通过ShareActionProvider共享)。从我所读过的内容来看,毕加索并不是真正能够开箱即用来处理这类事情的,尽管它提供了所有必要的工具。
我在研究之前的计划是创建一个简单的LruCache
,它使用url作为键和位图值。此缓存将通过Picasso的onBitmapLoaded
界面在Target
中进行。每当我想要共享图像时,我都会检查缓存中的位图。如果它不在那里,我会和Picasso一起取。既然我有一个缓存的位图,我会写一个文件(......这部分看起来不对,但我必须写一个文件来获取一个uri,对吗?)并添加文件uri到意图。
但是我看到使用Picasso.Builder
我可以设置(并保留对我自己的缓存的引用)https://stackoverflow.com/a/18552559/413254。这意味着我可以取消自定义Target
并混淆正确实施hashCode
和equals
方法,以确保准确回收,检索等。
我的问题是,毕加索如何使用这个缓存?有什么关键?有没有办法获得位图Uri而不将其写入磁盘?
答案 0 :(得分:0)
如果您想使用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
写入共享外部文件系统中的文件并共享。