본문 바로가기
2024 활동/Kotlin·Android

[Android] Intent로 ImageView 전달하기

by 은행장 노씨 2024. 5. 28.

 

뿌셔뿌셔

 

안드로이드에서 개발을 하다 보면, Activity간에 데이터를 주고받아야 할 때가 많다. 

그 중에서도 이미지를 하나의 액티비티에서 다른 액티비티로 전달하는 것을 배웠다. 

Intent를 사용하여 이미지 데이터를 ImageView로 전달하는 방법을 단계별로 정리해보겠다. 

 


(1) Intent Activity 한눈에 보기

구현할 동작은 다음과 같다. 

- Activity Intent1 -> Activity Intent2로 이미지를 보낸다. 

- Intent1에서 TextView를 클릭하면 Intent2의 ImageView로 uri가 전달된다. 

전체적인 로직

 

URI(Uniform Resource Indentifier)요?

: 자원을 나타내는 고유한 주소를 뜻한다. 

  • Intent 데이터 전달시 uri 형태여야 함.
  • Indentifier : 식별자, id

 

 

(2) Activity 구현하기

코드는 아래와 같다. 

2-1. Intent1

class Intent1 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_intent2)
        ViewCompt.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        
        // 명시적 인텐트 + 이미지 uri 전달
        (findViewById<TextView>(R.id.explicit_intent_action)).apply {
            this.setOnClickListener {
                val intent = Intent(this@Intent1, Intent2::class.java).apply {
                    val imageUri =
                        Uri.parse("android.resource://" + packageName + "/drawable/" + "pg")
                    this.action = Intent.ACTION_SEND
                    this.putExtra(Intent.EXTRA_STREAM, imageUri)
                    this.setType("image/*")
                }
                startActivity(intent)
            }
        }

    }
}

2-1. Intent2

package com.example.fastcampus_ktc

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class Intent2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_intent2)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        val imageView = findViewById<ImageView>(R.id.imageView)
        val uri = Uri.parse(
            intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM).toString()
        )
        imageView.setImageURI(uri)

    }
}

 

2-3. 결과 화면

결과는 다음과 같다.

결과 애뮬레이터 캡처

 

Intent2로 보자면 원래 <ImageView>화면은 초록색 바탕이다. 

Intent1에서 클릭을 하면 Intent2로 화면 전환이 되면서 (내가 좋아하는) 펭귄 사진이 뜬다. 

 

 

(3) 문제 : 'getParcelableExtra(String!): T?' is deprecated.

Intent2의 해당 메소드 삭제됐다.

아직까지는 getParcelableExtra를 사용할 수 있기는 한데, 그래도 공식문서를 찾아봤다. 

https://developer.android.com/sdk/api_diff/t-beta2-incr/changes/android.content.Intent

 

android.content.Intent

Class android.content.Intent     Removed Fields String EXTRA_NEW_UID   String EXTRA_PREVIOUS_UID   String EXTRA_UID_CHANGING    

developer.android.com

 

Changed Methods -> T  getParcelableExtra(String) 
Added Methods -> T getParcelableExtra(String, Class<T>)

 

인자에 클래스를 추가해야하는 메소드로 바뀌었다.

새로운 API 메서드를 사용하면, 반환 타입을 명확히 지정할 수 있기 때문에 컴파일 타임에 타입 검사를 통해 오류를 방지할 수 있다.

 

수정된 Intent2의 getParcelableExtra 코드는 다음과 같다.

val imageView = findViewById<ImageView>(R.id.imageView)
    val uri: Uri? = intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
    uri?.let {
        imageView.setImageURI(it)
  }

 

 


정리해보자. 

  1. Intent를 사용한 데이터 전달
    Intent를 사용하여 액티비티 간 데이터를 주고받는 방법을 배웠다.
    특히 Intent.ACTION_SEND와 EXTRA_STREAM을 사용하여 이미지 URI를 전달한다.
  2. getParcelableExtra 메서드getParcelableExtra(String) 메서드가 deprecated 되었다
    -> 대신
    getParcelableExtra(String, Class<T>) 메서드를 사용하여 타입 안전성을 보장할 수 있다.