Fresco: Saat mencoba mengambilImageFromBitmapCache() untuk gambar GIF, imageReference selalu null

Dibuat pada 30 Jan 2017  ·  4Komentar  ·  Sumber: facebook/fresco

Saya ingin mengizinkan pengguna untuk menyimpan gambar GIF di aplikasi kami. Saya mencoba mendapatkan gambar GIF dari cache Fresco melalui fetchImageFromBitmapCache() tetapi selalu mengembalikan NULL untuk gambar GIF.
Untuk gambar JPG dan PNG tidak ada masalah.

question

Komentar yang paling membantu

Terima kasih, itu berhasil. Saya berhasil menyimpan file dengan kode ini:

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

Semua 4 komentar

Apakah Anda menambahkan compile 'com.facebook.fresco:animated-gif:1.0.1' ke build.gradle ?

Ya, saya memiliki garis itu.

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

Saya kira Anda harus menggunakan fetchDecodedImage sebagai gantinya karena gambar animasi ditangani sedikit berbeda dari bitmap statis normal (saat ini tidak dalam cache bitmap yang sama).

Namun, jika Anda ingin mengizinkan orang untuk menyimpan gambar, Anda harus mendapatkan gambar yang dikodekan alih-alih gambar yang didekodekan, yaitu fetchEncodedImage .

Terima kasih, itu berhasil. Saya berhasil menyimpan file dengan kode ini:

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);
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ykostova picture ykostova  ·  3Komentar

hanhmh1203 picture hanhmh1203  ·  4Komentar

zewenwang picture zewenwang  ·  4Komentar

eldk picture eldk  ·  3Komentar

amodkanthe picture amodkanthe  ·  3Komentar