문제 상황
현재 진행하는 프로젝트에 문의하기 기능을 선택하면, 휴대폰의 기본 정보와 문의 이메일을 보내야하는 주소 등이 입력되서 이메일을 보낼 수 있도록 이메일 앱으로 이동하는 기능이 있다. 그런데 현재 문의하기 기능을 선택했을 때, 뜨는 앱들이 이메일 앱으로 필터링이 되는것이 아니라 모든 관련 앱이 선택할 수 있도록 리스트가 뜨기 때문에 앱 리스트의 종류를 제한하고, 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
https://developer.android.com/guide/components/intents-filters
'질문 정리' 카테고리의 다른 글
컴포즈 블루투스 권한 없을 때 처리 (0) | 2024.06.27 |
---|---|
Compose Snackbar 알림 관리를 위한 Utils (0) | 2024.06.20 |
Kotlin에서 리스트와 맵의 변환: 순서가 유지될까? (0) | 2024.06.18 |
안드로이드 알림 구현(헤드업 알림 포함) (0) | 2024.06.17 |
Compose BackHander, 앱 종료가 안되는 이유 (0) | 2024.06.05 |