본문 바로가기
안드로이드 코틀린

[Kotlin][Android] url로 가져온 이미지 다운로드하기

by teamnova 2022. 1. 22.

안녕하세요 이번 글에서는 이미지 url을 가지고 이미지를 다운로드하는 기능을 만들어보겠습니다.

 

환경: android sdk 28 / viewbinding 사용

 

 

먼저 manifest에서 권한설정을 해주겠습니다

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

 

 

 

다음으로 간단한 레이아웃을 만들어보겠습니다.

activity_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textUri" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="download image" />
</LinearLayout>

url을 입력할 수 있는 edit text와 다운로드하는 버튼이 있는 화면입니다.

 

 

 

마지막으로 다운로드 동작을 하는 액티비티를 만들어줍니다.

ImageActivity.kt

class ImageActivity : AppCompatActivity() {

    lateinit var binding: ActivityImageBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)


        with(binding) {
            btn.setOnClickListener { downloadImage(edt.text.toString()) }
        }
    }

    @SuppressLint("SimpleDateFormat")
    private fun downloadImage(url: String) {
        if (checkPermission()) {
            val fileName =
                "/${getString(R.string.app_name)}/${SimpleDateFormat("yyyyMMddHHmmss").format(Date())}.jpg" // 이미지 파일 명


            val req = DownloadManager.Request(Uri.parse(url))

            req.setTitle(fileName) // 제목
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) // 알림 설정
                .setMimeType("image/*")
                .setDestinationInExternalPublicDir(
                    Environment.DIRECTORY_PICTURES,
                    fileName
                ) // 다운로드 완료 시 보여지는 이름

            val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager

            manager.enqueue(req)
        } else requestPermission()
    }

    fun checkPermission() =
        (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED)
                && 
                (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED)

    fun requestPermission() {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ),
            0
        )
    }
}

 

downloadImage()에서는 읽기/쓰기 권한이 있는지 우선 체크한 뒤, 없다면 권한 요청을, 있다면 해당 url의 이미지를 DownloadManager를 이용해 다운로드합니다.