728x90
URI가 있을 때 사진을 다운로드 할 수 있는 코드입니다.
서버에서 가져온 이미지를 다운로드 버튼을 누를경우 나의 핸드폰 갤러리에 저장할 수 있습니다.
아래의 코드를 참고하세요.
스틱코드 게시글에서도 확인하여 설치 후 자동완성으로 편리하게 사용하실 수 있습니다.
https://stickode.com/detail.html?no=2697
<?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;
}
}
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] 비밀번호 hash 암호화하기 (0) | 2021.12.30 |
---|---|
[Java][Android] 복사하여 붙혀넣기 (0) | 2021.12.29 |
[JAVA][Android] Retrofit으로 데이터 insert하기 (0) | 2021.12.11 |
[JAVA][Android] 간단한 위젯 만들기 (0) | 2021.12.08 |
[Java][Android] DownloadManager을 통해 url로 이미지, 영상 디바이스에 저장 (0) | 2021.12.04 |