본문 바로가기
안드로이드 자바

[JAVA][Android] 사진 다운로드 하기

by teamnova 2021. 12. 19.
728x90

URI가 있을 때 사진을 다운로드 할 수 있는 코드입니다.

서버에서 가져온 이미지를 다운로드 버튼을 누를경우 나의 핸드폰 갤러리에 저장할 수 있습니다.

아래의 코드를 참고하세요.

스틱코드 게시글에서도 확인하여 설치 후 자동완성으로 편리하게 사용하실 수 있습니다.

https://stickode.com/detail.html?no=2697 

 

스틱코드

 

stickode.com

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".Activity.ImgFullActivity">

    <ImageView
        android:id="@+id/imgFull"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9.5" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:layout_gravity="right"
        >

        <Button
            android:id="@+id/btn_photoDown"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:text="다운로드" />

    </LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.bumptech.glide.Glide;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class ImgFullActivity extends AppCompatActivity {
    private static final String TAG = "ImgFullActivity";
    ImageView imgFull;
    Button btn_photoDown;

    String time = get_now_time();
    // 다운받은 파일이 저장될 위치 설정
    private final String outputFilePath = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS + "/BlaBla") + "/" + time;
    private DownloadManager mDownloadManager;
    private Long mDownloadQueueId;
    private File file_a, dir_a;
    private String saveFolderName = "BlaBla";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_img_full);
        imgFull = findViewById(R.id.imgFull);
        btn_photoDown = findViewById(R.id.btn_photoDown);

        Intent intent = getIntent();
        String img = "http://이미지의 서버주소";
        Uri uri = Uri.parse(img);

        Glide.with(this)
                .load(img)
                .fitCenter()
                .into(imgFull);

        btn_photoDown.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                URLDownloading(uri);
            }
        });
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        
        // 브로드캐스트 리시버 등록
        // ACTION_DOWNLOAD_COMPLETE : 다운로드가 완료되었을 때 전달
        IntentFilter completeFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadCompleteReceiver, completeFilter);
    }

    @Override
    public void onPause(){
        super.onPause();
        unregisterReceiver(downloadCompleteReceiver);
    }

    private void URLDownloading(Uri url) {
        if (mDownloadManager == null) {
            mDownloadManager = (DownloadManager) ImgFullActivity.this.getSystemService(Context.DOWNLOAD_SERVICE);
        }
        File outputFile = new File(outputFilePath);
        if (!outputFile.getParentFile().exists()) {
            outputFile.getParentFile().mkdirs();
        }

        Uri downloadUri = url;
        // DownloadManager.Request을 설정하여 DownloadManager Queue에 등록하게 되면 큐에 들어간 순서대로 다운로드가 처리된다.
        // DownloadManager.Request : Request 객체를 생성하며 인자로 다운로드할 파일의 URI를 전달한다.
        DownloadManager.Request request = new DownloadManager.Request(downloadUri);
        List<String> pathSegmentList = downloadUri.getPathSegments();
        // setTitle : notification 제목
        request.setTitle("다운로드 항목");
        request.setDescription("Downloading Dev Summit"); //setDescription: 노티피케이션에 보이는 디스크립션입니다.
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);   // setNotificationVisibility : VISIBILITY_VISIBLE로 설정되면 notification에 보여진다.
        request.setDestinationUri(Uri.fromFile(outputFile));   // setDestinationUri : 파일이 저장될 위치의 URI
        request.setAllowedOverMetered(true);

        // DownloadManager 객체 생성하여 다운로드 대기열에 URI 객체를 넣는다.
        mDownloadQueueId = mDownloadManager.enqueue(request);
    }

    // 다운로드 상태조회
    private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if(mDownloadQueueId == reference){
                DownloadManager.Query query = new DownloadManager.Query();  // 다운로드 항목 조회에 필요한 정보 포함
                query.setFilterById(reference);
                Cursor cursor = mDownloadManager.query(query);

                cursor.moveToFirst();

                int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);

                int status = cursor.getInt(columnIndex);
                int reason = cursor.getInt(columnReason);

                cursor.close();

                switch (status) {
                    case DownloadManager.STATUS_SUCCESSFUL :
                        Toast.makeText(ImgFullActivity.this, "다운로드를 완료하였습니다.", Toast.LENGTH_SHORT).show();
                        break;

                    case DownloadManager.STATUS_PAUSED :
                        Toast.makeText(ImgFullActivity.this, "다운로드가 중단되었습니다.", Toast.LENGTH_SHORT).show();
                        break;

                    case DownloadManager.STATUS_FAILED :
                        Toast.makeText(ImgFullActivity.this, "다운로드가 취소되었습니다.", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }
    };


    // 갤러리 갱신
    private void galleryAddPic(String Image_Path) {
        // 이전 사용 방식
        /*Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(Image_Path);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.context.sendBroadcast(mediaScanIntent);*/

        File file = new File(Image_Path);
        MediaScannerConnection.scanFile(
                this,
                new String[]{file.toString()},
                null, null);
    }

    private String get_now_time() {
        long now = System.currentTimeMillis(); // 현재 시간을 가져온다.
        Date mDate = new Date(now); // Date형식으로 고친다.
        // 날짜, 시간을 가져오고 싶은 형태로 가져올 수 있다.
        @SuppressLint("SimpleDateFormat")
        SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss", Locale.KOREA);
        String now_time = simpleDate.format(mDate);
        Log.d(TAG, "태그 현재시간 now_time : " + now_time);
        return now_time;
    }

}

https://stickode.com/detail.html?no=2697 

 

스틱코드

 

stickode.com