Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从毕加索那里获取图像uri?_Android_Caching_Bitmap_Shareactionprovider_Picasso - Fatal编程技术网

Android 从毕加索那里获取图像uri?

Android 从毕加索那里获取图像uri?,android,caching,bitmap,shareactionprovider,picasso,Android,Caching,Bitmap,Shareactionprovider,Picasso,我有一个相当大的图像URL列表,我正在使用毕加索加载ViewPager。我需要能够通过意图(最终通过共享)为这些图像提供共享功能。从我所读到的,毕加索并不是真的能够处理这种开箱即用的东西,尽管它提供了所有必要的工具 我在研究之前的计划是创建一个简单的LruCache,它使用url作为键和位图值。这种缓存将通过毕加索的Target接口在onBitmapLoaded中进行。每当我想要共享图像时,我都会检查缓存中的位图。如果它不在那里,我就去找毕加索。现在我已经有了一个缓存的位图,我将写入一个文件(…

我有一个相当大的图像URL列表,我正在使用毕加索加载
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从那拿了过来。已经有一段时间了\_(ツ)_/¯