[안드로이드/Android] Image Web Download (이미지를 웹사이트에서 다운로드)

2015. 11. 11. 14:30Programing/Android / Java

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

 

 

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

 

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

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 에 저장하기 위해 저장하기 버튼 이벤트를 구현합니다.

 

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

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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 의 전체 소스 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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 에 저장하기


출처 : http://mainia.tistory.com/1521