Android 从毕加索那里获取图像uri?
我有一个相当大的图像URL列表,我正在使用毕加索加载Android 从毕加索那里获取图像uri?,android,caching,bitmap,shareactionprovider,picasso,Android,Caching,Bitmap,Shareactionprovider,Picasso,我有一个相当大的图像URL列表,我正在使用毕加索加载ViewPager。我需要能够通过意图(最终通过共享)为这些图像提供共享功能。从我所读到的,毕加索并不是真的能够处理这种开箱即用的东西,尽管它提供了所有必要的工具 我在研究之前的计划是创建一个简单的LruCache,它使用url作为键和位图值。这种缓存将通过毕加索的Target接口在onBitmapLoaded中进行。每当我想要共享图像时,我都会检查缓存中的位图。如果它不在那里,我就去找毕加索。现在我已经有了一个缓存的位图,我将写入一个文件(…
ViewPager
。我需要能够通过意图(最终通过共享)为这些图像提供共享功能。从我所读到的,毕加索并不是真的能够处理这种开箱即用的东西,尽管它提供了所有必要的工具
我在研究之前的计划是创建一个简单的LruCache
,它使用url作为键和位图值。这种缓存将通过毕加索的Target
接口在onBitmapLoaded
中进行。每当我想要共享图像时,我都会检查缓存中的位图。如果它不在那里,我就去找毕加索。现在我已经有了一个缓存的位图,我将写入一个文件(…这部分似乎不正确,尽管我必须写入一个文件才能获得uri,对吗?)并将文件uri添加到意图中
然而,我看到,通过毕加索.Builder
我可以设置(并保留对)我自己的缓存-。这意味着我可以通过正确地实现hashCode
和equals
方法来消除自定义目标
和混淆,以确保准确的回收、检索等
我的问题是,毕加索如何使用这个缓存?钥匙是什么?有没有一种方法可以在不将位图Uri写入磁盘的情况下获取位图Uri?如果要使用
ShareActionProvider
共享当前页面上的图像,则不必保留自己的图像缓存。但是,为了能够将图像共享给其他人,图像应该位于设备上的共享文件系统中
如果使用具有自定义磁盘缓存支持的映像加载库(如
如果你想用毕加索(这是个好决定)
您必须在每次页面更改时保存图像的副本,这不是一个好的选择
或者,您可以给毕加索一个自定义网络处理程序,并为其设置自定义缓存实现。我建议使用OkHttp和自定义缓存,以您想要的格式存储文件。当您这样做时,您必须有一个将图像URL转换为设备上的文件路径的函数
在每次页面更改中,如果您的ViewPager
中有片段,请将ShareActionProvider
放入片段中
获取onCreateOptions菜单中ShareActionProvider
的参考。然后使用获得的文件路径设置意图
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
准备好,以便用户在开始之前共享。你必须准备好,即使用户不愿意分享
但是当你有一个普通的按钮时,这就容易多了,因为你只在用户点击共享按钮时才进行操作。在这种情况下,您只需使用目标
对象从毕加索
再次请求图像,然后将获得的位图
写入共享外部文件系统中的文件并共享 毕加索将保存请求中的钥匙。该键是使用URL加上所有唯一的转换键(如调整大小、旋转和自定义转换)构建的。您好@loeschg您有解决方案吗?我正在使用毕加索和OkHttpDownloader将图像加载到sd卡中。我想用给定的url获取图像uri。你能和我分享你的密码吗?@Noundla不幸的是,我不相信我有。我可能用了我自己的LruCache从那拿了过来。已经有一段时间了\_(ツ)_/¯