Fresco: Beim Versuch, ImageFromBitmapCache() für GIF-Bilder abzurufen, ist imageReference immer null

Erstellt am 30. Jan. 2017  ·  4Kommentare  ·  Quelle: facebook/fresco

Ich möchte Benutzern ermöglichen, GIF-Bilder in unserer App zu speichern. Ich versuche, ein GIF-Bild aus dem Fresco-Cache über fetchImageFromBitmapCache() aber es gibt immer NULL für GIF-Bilder zurück.
Für JPG- und PNG-Bilder gibt es kein Problem.

question

Hilfreichster Kommentar

Danke, es hat funktioniert. Ich habe es geschafft, Dateien mit diesem Code zu speichern:

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

Alle 4 Kommentare

Haben Sie compile 'com.facebook.fresco:animated-gif:1.0.1' zu Ihrem build.gradle hinzugefügt?

Ja, ich habe diese Zeile.

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

Ich denke, Sie müssen stattdessen fetchDecodedImage verwenden, da animierte Bilder etwas anders behandelt werden als normale statische Bitmaps (derzeit nicht im selben Bitmap-Cache).

Wenn Sie jedoch Personen erlauben möchten, Bilder zu speichern, sollten Sie das codierte Bild anstelle des decodierten Bildes erhalten, dh fetchEncodedImage .

Danke, es hat funktioniert. Ich habe es geschafft, Dateien mit diesem Code zu speichern:

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);
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen