Reputation: 213
I am new android and I want to save GIF image in sdcard through android programming. Currently I had done some code from google to save GIF image in sdcard. But When I am saving that image to sdcard it will display normal image not GIF Image.
Here this is my code to display GIF image
//Save code
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Bitmap image = BitmapFactory.decodeResource(getResources(),
R.drawable.gpp3);
File outputFile = new File("/sdcard/gpp3.gif");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(outputFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if (fos != null) {
AnimatedGifEncoder gifEncoder = new AnimatedGifEncoder();
gifEncoder.start(fos);
gifEncoder.addFrame(image);
gifEncoder.finish();
}
}
});
So,What is the problem in above code.Please tell me.
Upvotes: 3
Views: 6411
Reputation: 303
Use the provide code and make sure to add WRITE_EXTERNAL_STORAGE in meaifest.
protected void saveGifToInternalStorage(String fileName, URL url) {
try {
String PATH = Environment.getExternalStorageDirectory() + "/download/your_app_name";
File file = new File(PATH);
if(!file.exists()) {
file.mkdirs();
}
long startTime = System.currentTimeMillis();
Log.d(TAG, "download begining");
Log.d(TAG, "download url:" + url);
Log.d(TAG, "downloaded file name:" + fileName);
/* Open a connection to that URL. */
URLConnection ucon = url.openConnection();
/*
* Define InputStreams to read from the URLConnection.
*/
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
/*
* Read bytes to the Buffer until there is nothing more to read(-1).
*/
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
/* Convert the Bytes read to a String. */
File outputFile = new File(file, fileName+".gif");
FileOutputStream fos = new FileOutputStream(outputFile);
fos.write(baf.toByteArray());
fos.close();
Log.d(TAG, "download ready in"
+ ((System.currentTimeMillis() - startTime) / 1000)
+ " sec");
} catch (IOException e) {
Log.d(TAG, "Error: " + e);
}
}
Upvotes: 0
Reputation: 4233
I am not sure but as per your requirement you should first open your GIF and then after you convert into byte array then after you save it.i hope you will get your solution
private void saveGIF()
{
try
{
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "shared_gif_shai" + System.currentTimeMillis() + ".gif");
long startTime = System.currentTimeMillis();
Log.d(TAG, "on do in background, url open connection");
InputStream is = getResources().openRawResource(R.drawable.g);
Log.d(TAG, "on do in background, url get input stream");
BufferedInputStream bis = new BufferedInputStream(is);
Log.d(TAG, "on do in background, create buffered input stream");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Log.d(TAG, "on do in background, create buffered array output stream");
byte[] img = new byte[1024];
int current = 0;
Log.d(TAG, "on do in background, write byte to baos");
while ((current = bis.read()) != -1) {
baos.write(current);
}
Log.d(TAG, "on do in background, done write");
Log.d(TAG, "on do in background, create fos");
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
Log.d(TAG, "on do in background, write to fos");
fos.flush();
fos.close();
is.close();
Log.d(TAG, "on do in background, done write to fos");
}
catch (Exception e) {
e.printStackTrace();
}
}
And also Give this permission in you AndroidMenifest.xml file
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Upvotes: 9