안드로이드(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 미디어 파일 읽어 MP3 실행하기 (0) | 2015.01.29 |
---|---|
안드로이드(Android) MediaPlayer 이용해 raw 폴더의 MP3 듣기 (0) | 2015.01.26 |
안드로이드(Android) 행열(Matrix) 클래스의 postConcat() 함수이용해 거울이미지구현 (0) | 2015.01.25 |
안드로이드(Android) 비트맵 이미지를 다양한 방법으로 변형하는 예제 (0) | 2015.01.19 |
안드로이드(Android) AutoCompleteTextView 위젯을 이용해 단어 자동완성기능 구현 (0) | 2015.01.12 |
안드로이드(Android) EditText 위젯의 입력타입별 예제 (0) | 2015.01.11 |
안드로이드(Android) raw 폴더에 있는 Text 파일 읽어 오기 (1) | 2015.01.08 |
안드로이드(Android) Chronometer 사용하여 시간측정을 위한 타이머 만들기 (1) | 2015.01.05 |