Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) 이미지다운로드해서 Sdcard 에 저장하기

안드로이드 개발
반응형

안드로이드(Android) 이미지다운로드해서 Sdcard 에 저장하기

 

환경 : Eclipse Mars, Android 4.2.2

 

이번예제는 이미지를 웹사이트에서 다운로드한 후 SD 카드에 저장하는 예제 입니다. 이전에 작성했던 안드로이드(Android) 웹페이지에서 이미지 다운로드 구현에서 SD 카드에 저장하는 부분을 추가하도록 하겠습니다.

 

 

먼저 이미지 다운로드를 위해 AndroidManifest.xml 퍼미션을 추가합니다

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

이미지 다운로드를 위해 AsyncTask 클래스를 상속받아 OpenHttpConnection 만들었습니다. doInBackground() 함수에서 웹사이트에 있던 이미지를 다운받아 Bitmap 으로 변환합니다. 그리고 완료가 되면 onPostExecute() 함수가 수행되는데 이곳에 다운받은 이미지를 미리 만들어 둔 Bitmap mSaveBm 이라는 전역변수에 저장합니다.

 

private class OpenHttpConnection extends AsyncTask<Object, Void, Bitmap> {

	private ImageView bmImage;

	@Override
	protected Bitmap doInBackground(Object... params) {
		Bitmap mBitmap = null;
		bmImage = (ImageView) params[0];
		String url = (String) params[1];
		InputStream in = null;
		try {
			in = new java.net.URL(url).openStream();
			mBitmap = BitmapFactory.decodeStream(in);
			in.close();

		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return mBitmap;
	}

	@Override
	protected void onPostExecute(Bitmap bm) {
		super.onPostExecute(bm);
		mSaveBm = bm;
		bmImage.setImageBitmap(bm);
	}
}

 

전역에 저장한 Bitmap 이미지를 SDCARD 에 저장하기 위해 저장하기 버튼 이벤트를 구현합니다.

 

Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(btnSaveOnClickListener);

 

저장하기 버튼 이벤트는 Environment.getExternalStorageDirectory() 함수를 통해 저장할 주소를 가져온뒤 File 객체 생성을 위해 인수로 넘깁니다. 넘길때 파일명도 같이 넘깁니다. 그리고 파일 저장을 위해 자주 쓰이는 FileOutputStream() 객체를 생성한후 flush() 함수를 통해 SDCARD 에 파일을 저장합니다. 저장전에 압축포맷 옵션을 셋팅하였습니다. 압축율과 Bitmap.CompressFormat.PNG 옵션으로 PNG 파일로 저장하게 되는 것입니다.

 

Button.OnClickListener btnSaveOnClickListener = 
		new Button.OnClickListener() {

	public void onClick(View arg0) {
		OutputStream outStream = null;
		String extStorageDirectory = 
				Environment.getExternalStorageDirectory().toString();
		
		File file = new File(extStorageDirectory, "downimage.PNG");
		try {
			outStream = new FileOutputStream(file);
			mSaveBm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
			outStream.flush();
			outStream.close();

			Toast.makeText(ImageSdcardSaveActivity.this, 
					"Saved", Toast.LENGTH_LONG).show();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
			Toast.makeText(ImageSdcardSaveActivity.this, 
					e.toString(), Toast.LENGTH_LONG).show();
		} catch (IOException e) {
			e.printStackTrace();
			Toast.makeText(ImageSdcardSaveActivity.this, 
					e.toString(), Toast.LENGTH_LONG).show();
		}
	}
};

 

메인 activity 의 레이아웃 xml 입니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#3F0099"
        android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
        android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
        android:text="웹페이지에서 다운받은 이미지 저장하기 "
        android:textColor="#FFFFFF" />
    
	<Button
        android:id="@+id/btnSave"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="저장하기" />
    
    <ImageView
        android:id="@+id/image"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/abc_action_bar_icon_vertical_padding"
        android:paddingTop="@dimen/abc_action_bar_icon_vertical_padding"
        android:scaleType="center" />
</LinearLayout>

 

이미지 저장을 위한 메인 activity 의 전체 소스 입니다.


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class ImageSdcardSaveActivity extends Activity {

	String imageUrl = "https://t1.daumcdn.net/cfile/tistory/21097435544EC2FB1B";
	Bitmap mSaveBm;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_image_sdcard_save);

		ImageView bmImage = (ImageView) findViewById(R.id.image);
		Button btnSave = (Button) findViewById(R.id.btnSave);
		btnSave.setOnClickListener(btnSaveOnClickListener);
		
		BitmapFactory.Options bmOptions;
		bmOptions = new BitmapFactory.Options();
		bmOptions.inSampleSize = 1;

		OpenHttpConnection opHttpCon = new OpenHttpConnection();
		opHttpCon.execute(bmImage, imageUrl);
	}

	Button.OnClickListener btnSaveOnClickListener = 
			new Button.OnClickListener() {
	
		public void onClick(View arg0) {
			OutputStream outStream = null;
			String extStorageDirectory = 
					Environment.getExternalStorageDirectory().toString();
			
			File file = new File(extStorageDirectory, "downimage.PNG");
			try {
				outStream = new FileOutputStream(file);
				mSaveBm.compress(
Bitmap.CompressFormat.PNG, 100, outStream);
				outStream.flush();
				outStream.close();
	
				Toast.makeText(ImageSdcardSaveActivity.this, 
						"Saved", Toast.LENGTH_LONG).show();
	
			} catch (FileNotFoundException e) {
				e.printStackTrace();
				Toast.makeText(ImageSdcardSaveActivity.this, 
						e.toString(), Toast.LENGTH_LONG).show();
			} catch (IOException e) {
				e.printStackTrace();
				Toast.makeText(ImageSdcardSaveActivity.this, 
						e.toString(), Toast.LENGTH_LONG).show();
			}
		}
	};

	private class OpenHttpConnection extends AsyncTask<Object, Void, Bitmap> {

		private ImageView bmImage;

		@Override
		protected Bitmap doInBackground(Object... params) {
			Bitmap mBitmap = null;
			bmImage = (ImageView) params[0];
			String url = (String) params[1];
			InputStream in = null;
			try {
				in = new java.net.URL(url).openStream();
				mBitmap = BitmapFactory.decodeStream(in);
				in.close();

			} catch (Exception ex) {
				ex.printStackTrace();
			}
			return mBitmap;
		}

		@Override
		protected void onPostExecute(Bitmap bm) {
			super.onPostExecute(bm);
			mSaveBm = bm;
			bmImage.setImageBitmap(bm);
		}
	}
}

 

 

안드로이드(Android) 이미지다운로드해서 Sdcard 에 저장하기

 

반응형
Posted by 녹두장군

댓글을 달아 주세요

  1. so difficult to do 2015.09.09 23:53  댓글주소  수정/삭제  댓글쓰기

    캡쳐한 화면들이 어느 부분에 들어가야하는지 잘 모르겠어요~
    Activity에 들어가는건지 Class를 따로 만들어서 하는건지 모르겠어요ㅜㅜ

  2. 학생개발자 2015.11.07 20:45  댓글주소  수정/삭제  댓글쓰기

    mSaveBm.compress(Bitmap.CompressFormat.JPEG, 100, outStream); 문장에서

    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference

    발생하고, 저 위 예제랑 똑같이 써도 저런 에러가 납니다ㅠㅠㅠㅠ

  3. Favicon of https://victor8481.tistory.com 빅터크룸 2015.11.11 14:31 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사드립니다^^