Fresco: 尝试为 GIF 图像 fetchImageFromBitmapCache() 时,imageReference 始终为 null

创建于 2017-01-30  ·  4评论  ·  资料来源: facebook/fresco

我想允许用户在我们的应用程序中保存 GIF 图像。 我试图通过fetchImageFromBitmapCache()从 Fresco 缓存中获取 GIF 图像,但它总是为 GIF 图像返回 NULL。
对于 JPG 和 PNG 图像没有问题。

question

最有用的评论

谢谢,它奏效了。 我设法使用以下代码保存文件:

DataSource<CloseableReference<PooledByteBuffer>>
                dataSource = Fresco.getImagePipeline().fetchEncodedImage(ImageRequest.fromUri(imageUrl), App.getContext());

        DataSubscriber<CloseableReference<PooledByteBuffer>> dataSubscriber =
                new BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() {
                    <strong i="6">@Override</strong>
                    protected void onNewResultImpl(
                            DataSource<CloseableReference<PooledByteBuffer>> dataSource) {
                        if (!dataSource.isFinished()) {
                            return;
                        }
                        CloseableReference<PooledByteBuffer> ref = dataSource.getResult();
                        if (ref != null) {
                            try {
                                PooledByteBuffer pooledByteBuffer = ref.get();
                                PooledByteBufferInputStream sourceIs = new PooledByteBufferInputStream(pooledByteBuffer);
                                BufferedInputStream bis = new BufferedInputStream(sourceIs);
                                String newFilePath = getAppFolderPath() + UUID.randomUUID().toString().toLowerCase() + "_" + URLUtil.guessFileName(imageUrl, null, null);
                                File targetFile = new File(newFilePath);
                                createDirectories(targetFile.getPath());
                                try {
                                    BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(newFilePath));
                                    int i;
                                    do {
                                        i = bis.read();
                                        if (i != -1)
                                            fout.write(i);
                                    } while (i != -1);
                                    bis.close();
                                    fout.close();
                                    registerMediaInDeviceGallery(new File(newFilePath));
                                    showMessage(R.string.saved_to_gallery);
                                } catch (IOException e) {
                                    targetFile.delete();
                                    e.printStackTrace();
                                    showMessage(R.string.failed_to_save_to_gallery);
                                }

                            } finally {
                                CloseableReference.closeSafely(ref);
                            }
                        }
                    }

                    <strong i="7">@Override</strong>
                    protected void onFailureImpl(DataSource<CloseableReference<PooledByteBuffer>> dataSource) {
                        Throwable t = dataSource.getFailureCause();
                        Log.e(TAG, "onFailureImpl: ", t);
                        showMessage(R.string.failed_to_save_to_gallery);
                    }
                };

        dataSource.subscribe(dataSubscriber, Runnable::run);

所有4条评论

您是否将compile 'com.facebook.fresco:animated-gif:1.0.1'到您的build.gradle

是的,我有那条线。

compile ('com.facebook.fresco:animated-gif:1.0.1') {
        exclude module: 'bolts-android'
    }

我想您必须使用fetchDecodedImage代替,因为动画图像的处理方式与普通静态位图略有不同(目前不在同一个位图缓存中)。

但是,如果你想让人们保存图像,你应该得到编码图像而不是解码图像,即fetchEncodedImage

谢谢,它奏效了。 我设法使用以下代码保存文件:

DataSource<CloseableReference<PooledByteBuffer>>
                dataSource = Fresco.getImagePipeline().fetchEncodedImage(ImageRequest.fromUri(imageUrl), App.getContext());

        DataSubscriber<CloseableReference<PooledByteBuffer>> dataSubscriber =
                new BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() {
                    <strong i="6">@Override</strong>
                    protected void onNewResultImpl(
                            DataSource<CloseableReference<PooledByteBuffer>> dataSource) {
                        if (!dataSource.isFinished()) {
                            return;
                        }
                        CloseableReference<PooledByteBuffer> ref = dataSource.getResult();
                        if (ref != null) {
                            try {
                                PooledByteBuffer pooledByteBuffer = ref.get();
                                PooledByteBufferInputStream sourceIs = new PooledByteBufferInputStream(pooledByteBuffer);
                                BufferedInputStream bis = new BufferedInputStream(sourceIs);
                                String newFilePath = getAppFolderPath() + UUID.randomUUID().toString().toLowerCase() + "_" + URLUtil.guessFileName(imageUrl, null, null);
                                File targetFile = new File(newFilePath);
                                createDirectories(targetFile.getPath());
                                try {
                                    BufferedOutputStream fout = new BufferedOutputStream(new FileOutputStream(newFilePath));
                                    int i;
                                    do {
                                        i = bis.read();
                                        if (i != -1)
                                            fout.write(i);
                                    } while (i != -1);
                                    bis.close();
                                    fout.close();
                                    registerMediaInDeviceGallery(new File(newFilePath));
                                    showMessage(R.string.saved_to_gallery);
                                } catch (IOException e) {
                                    targetFile.delete();
                                    e.printStackTrace();
                                    showMessage(R.string.failed_to_save_to_gallery);
                                }

                            } finally {
                                CloseableReference.closeSafely(ref);
                            }
                        }
                    }

                    <strong i="7">@Override</strong>
                    protected void onFailureImpl(DataSource<CloseableReference<PooledByteBuffer>> dataSource) {
                        Throwable t = dataSource.getFailureCause();
                        Log.e(TAG, "onFailureImpl: ", t);
                        showMessage(R.string.failed_to_save_to_gallery);
                    }
                };

        dataSource.subscribe(dataSubscriber, Runnable::run);
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

goodev picture goodev  ·  4评论

eldk picture eldk  ·  3评论

stephen-workpop picture stephen-workpop  ·  4评论

satyarths picture satyarths  ·  3评论

bigfreeZhou picture bigfreeZhou  ·  4评论