질문 정리

Intent 정리: 문의하기 클릭 시 이메일 앱으로만 연결

five2week 2024. 6. 19. 13:00

문제 상황

현재 진행하는 프로젝트에 문의하기 기능을 선택하면, 휴대폰의 기본 정보와 문의 이메일을 보내야하는 주소 등이 입력되서 이메일을 보낼 수 있도록 이메일 앱으로 이동하는 기능이 있다. 그런데 현재 문의하기 기능을 선택했을 때, 뜨는 앱들이 이메일 앱으로 필터링이 되는것이 아니라 모든 관련 앱이 선택할 수 있도록 리스트가 뜨기 때문에 앱 리스트의 종류를 제한하고, Intent에 대해서 한번 더 정리하려고 한다.

싸피를 다닐 때, 안드로이드 강의 과정에서 이에 대해서 자세히 배웠으나 다 까먹고, 내 뇌에 남은 정보는 Intent는 개발자의 의도를 표현 이런 단편적인 내용 밖에 남아있지 않다. 그래서 그때 배우면서 정리했던 자료들과 android developers를 참고하여 다시 한번 간단하게 정리했습니다.

 

Intent

Intent는 안드로이드 어플리케이션을 구성하는 네 가지 기본 요소 간의 작업 수행을 위한 정보 전달 역할을 하고 있습니다.

val intent = Intent(this, ExampleActivity::class.java)
startActivity(intent)

위의 코드는 명시적 인텐트입니다. 실행하고자 하는 컴포넌트의 이름과 클래스 명이 명시적으로 작성되어 호출할 대상을 확실히 알 수 있는 경우에 사용합니다.

//암시적 인텐트 목적에 맞는 호출 : 지도보기, 연락처보기, 인터넷, SNS 공유 등등.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"))
startActivity(intent)

명시적 인텐트와 다르게 액션과 데이터를 지정하긴 했지만, 호출대상이 달라질 수 있는 경우에 사용합니다. 반드시 특정 컴포넌트를 지정하지 않고, 원하는 작업 의도만 담고 컴포넌트를 실행할 수 있습니다.

//지도 좌표
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:36.1234567,128:1234567"))
//주소록
val intent = Intent(Intent.ACTION_EDIT, Uri.parse("content://com.android.contacts/contacts/1"))
//웹페이지
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"))
//문자
val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:01012345678"))
//전화 다이얼 화면
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:01012345678"))
// 전화 걸기
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:01012345678"))

 

문의 이메일 보내기 기능

수정 전 버전의 경우, ACTION_SEND를 사용해서 구현했는데, 이 방법은 사용자가 선택할 수 있도록 공유할 수 있는 다이얼로그를 띄웁니다. 텍스트, 이미지, 비디오 등과 같은 다양한 형태의 데이터를 공유할 수 있으며, 사진을 공유하거나 텍스트 메세지를 공유할 때 주로 사용합니다.

fun sendEmail(
    activity: ComponentActivity,
    email: String,
    subject: String,
    emailLauncher: ActivityResultLauncher<Intent>,
) {
    val body =
        """
    |${getAppVersion(activity)}
    |${getDeviceModel(activity)}
    |${getAndroidVersion(activity)}
        """.trimMargin()

		val emailIntent = Intent(Intent.ACTION_SEND)
		emailIntent.type = "text/plain"
		emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
		emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
		emailIntent.putExtra(Intent.EXTRA_TEXT, body)

    emailLauncher.launch(emailIntent)
}

수정 후 버전의 경우, ACTION_SENDTO를 사용해서 구현했는데, 이 방법은 주로 이메일이나 SMS와 같은 특정 수신자에게 데이터를 보내는 경우에 사용합니다. 특정한 uri를 사용하여 (예: "mailto:" 또는 "smsto:") 데이터를 전송할 수 있는 특정 어플리케이션을 엽니다.

fun sendEmail(
    activity: ComponentActivity,
    email: String,
    subject: String,
    emailLauncher: ActivityResultLauncher<Intent>,
) {
    val body =
        """
    |${getAppVersion(activity)}
    |${getDeviceModel(activity)}
    |${getAndroidVersion(activity)}
        """.trimMargin()

    val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:")
        putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, body)
    }

    emailLauncher.launch(emailIntent)
}

 

참고링크

https://developer.android.com/reference/android/content/Intent

 

Intent  |  Android Developers

 

developer.android.com

 

https://developer.android.com/guide/components/intents-filters

 

인텐트 및 인텐트 필터  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 인텐트 및 인텐트 필터 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Intent는 다른 앱 구성요소에서

developer.android.com