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.
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);
Hilfreichster Kommentar
Danke, es hat funktioniert. Ich habe es geschafft, Dateien mit diesem Code zu speichern: