当使用Fresco时如何将图像保存到SD卡?

3

我在我的应用程序中使用 Fresco 来下载和显示 Gif。当用户点击图片时,我希望将其保存到sd卡中,但我不知道如何操作。

final View view = inflater.inflate(R.layout.fragment_gif_viewer, container, false);
SimpleDraweeView draweeView = (SimpleDraweeView) view.findViewById(R.id.image);
Uri uri = Uri.parse(imageUrl);
DraweeController controller = Fresco.newDraweeControllerBuilder()
        .setUri(uri)
        .setAutoPlayAnimations(true)
        .build();
draweeView.setController(controller);

draweeView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Save the gif to /sdcard/test.gif
    }
});

我按照如何将ImageView保存为图像的指示尝试从SimpleDraweeView中获取位图,但是它的getDrawingCache()返回null。

2个回答

2
你可以这样做:

你可以像这样做

ImageRequest downloadRequest = ImageRequest.fromUri(uri);
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(downloadRequest);
if (ImagePipelineFactory.getInstance().getMainDiskStorageCache().hasKey(cacheKey)) {
    BinaryResource resource = ImagePipelineFactory.getInstance().getMainDiskStorageCache().getResource(cacheKey);
    File cacheFile = ((FileBinaryResource) resource).getFile();
    FileInputStream fis = new FileInputStream(cacheFile);
    ImageFormat imageFormat = ImageFormatChecker.getImageFormat(fis);
    switch (imageFormat) {
        case GIF:
        //copy cacheFile to sdcard
        break;
    }
}

1
你测试过这个答案吗?它会出现空指针异常。 - Edijae Crusar
它在我的项目上运行。确保这个GIF被获取到磁盘缓存中。 - s1rius
1
API已更改,您应该使用getMainFileCache()而不是getMainDiskStorageCache()。这将返回整个缓存。但是,这将为您提供存储在Fresco缓存中的文件,而不是可以显示的文件。 - pranavrao1

0

你可以直接使用图像管道从磁盘缓存中提取GIF。

然后,你可以使用Java文件方法将其写入文件系统。


我知道如何使用图像管道保存静态图片,例如png。但是对于gif来说,情况就不同了。 - Allen Vork
正如Allen所提到的,gif被认为是“动画”,因此无法以相同的方式进行提取。 - pranavrao1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接