์ฌ์ฉ์๊ฐ ์ฑ์ GIF ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค. fetchImageFromBitmapCache()
๋ฅผ ํตํด Fresco ์บ์์์ GIF ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง GIF โโ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ํญ์ NULL์ ๋ฐํํฉ๋๋ค.
JPG ๋ฐ PNG ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
build.gradle
์ compile 'com.facebook.fresco:animated-gif:1.0.1'
๋ฅผ ์ถ๊ฐํ์
จ์ต๋๊น?
์, ๋๋ ๊ทธ ๋ผ์ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
compile ('com.facebook.fresco:animated-gif:1.0.1') {
exclude module: 'bolts-android'
}
์ ๋๋ฉ์ด์
์ด๋ฏธ์ง๊ฐ ์ผ๋ฐ ์ ์ ๋นํธ๋งต(ํ์ฌ ๋์ผํ ๋นํธ๋งต ์บ์์ ์์)๊ณผ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋์ fetchDecodedImage
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๋๋ก ํ์ฉํ๋ ค๋ฉด ๋์ฝ๋ฉ๋ ์ด๋ฏธ์ง ๋์ ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค(์: fetchEncodedImage
.
๋๋ถ์ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ์ด ์ฝ๋๋ก ํ์ผ์ ์ ์ฅํ ์ ์์์ต๋๋ค.
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);
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ถ์ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ์ด ์ฝ๋๋ก ํ์ผ์ ์ ์ฅํ ์ ์์์ต๋๋ค.