Fresco: Al intentar fetchImageFromBitmapCache () para una imagen GIF, imageReference siempre es nulo

Creado en 30 ene. 2017  ·  4Comentarios  ·  Fuente: facebook/fresco

Quiero permitir que los usuarios guarden imágenes GIF en nuestra aplicación. Estoy tratando de obtener una imagen GIF de la caché de Fresco a través de fetchImageFromBitmapCache() pero siempre devuelve NULL para las imágenes GIF.
Para imágenes JPG y PNG no hay problema.

question

Comentario más útil

Gracias, funcionó. Logré guardar archivos con este código:

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);

Todos 4 comentarios

¿Agregaste compile 'com.facebook.fresco:animated-gif:1.0.1' a tu build.gradle ?

Sí, tengo esa línea.

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

Supongo que debe usar fetchDecodedImage lugar, ya que las imágenes animadas se manejan de manera un poco diferente a los mapas de bits estáticos normales (no en la misma caché de mapa de bits actualmente).

Sin embargo, si desea permitir que las personas guarden imágenes, debe obtener la imagen codificada en lugar de la imagen decodificada, es decir, fetchEncodedImage .

Gracias, funcionó. Logré guardar archivos con este código:

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);
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

sungerk picture sungerk  ·  3Comentarios

goodev picture goodev  ·  4Comentarios

qiiyue picture qiiyue  ·  4Comentarios

hanhmh1203 picture hanhmh1203  ·  4Comentarios

lin-zy1229 picture lin-zy1229  ·  4Comentarios