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.
¿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);
Comentario más útil
Gracias, funcionó. Logré guardar archivos con este código: