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.
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);
Komentar yang paling membantu
Terima kasih, itu berhasil. Saya berhasil menyimpan file dengan kode ini: