从毕加索获得图像uri?

loe*_*chg 15 android caching bitmap shareactionprovider picasso

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

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

但是我看到Picasso.Builder我可以设置(并保留对我自己的缓存的引用) - /sf/answers/1298679161/.这意味着我可以Target通过正确实施hashCodeequals方法来消除习惯和混乱,以确保准确的回收,检索等.

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

tas*_*iac 1

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

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

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

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

或者您可以为 Picasso 提供自定义网络处理程序并为其设置自定义缓存实现。我建议使用带有自定义缓存的 OkHttp,它以您想要的格式存储文件。当您这样做时,您必须有一个将图像 URL 转换为设备上的文件路径的函数。

在每个页面更改中,如果您Fragment的 中有一个ViewPager,请将其ShareActionProvider放入您的 Fragments 中。

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);
Run Code Online (Sandbox Code Playgroud)

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

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