Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

코틀린(Kotlin)으로 안드로이드에서 파일 첨부 이메일 전송하는 방법

이 튜토리얼에서는 코틀린(Kotlin)을 사용하여 안드로이드 앱에서 파일(이미지 등)을 첨부한 이메일을 전송하는 방법을 단계별로 알아봅니다. 핵심 원리는 Intent.ACTION_SEND를 활용해 기기에 설치된 이메일 앱(Gmail 등)을 호출하고, EXTRA_STREAM으로 첨부 파일의 URI를 전달하는 것입니다.

1단계: 새 프로젝트 생성

Android Studio를 열고 File → New Project 메뉴로 이동한 뒤, 빈 액티비티(Empty Activity) 템플릿으로 새 프로젝트를 생성하고 필요한 정보를 모두 입력합니다.

2단계: 레이아웃 작성 (res/layout/activity_main.xml)

수신자 이메일 주소, 제목, 본문을 입력받는 EditText 세 개와 '보내기' 버튼, '첨부' 버튼, 그리고 선택된 첨부 파일 이름을 표시할 TextView를 배치합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="4dp"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/etTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:hint="Receiver's Email Address!"
        android:inputType="textEmailAddress"
        android:singleLine="true" />
    <EditText
        android:id="@+id/etSubject"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:hint="Enter Subject"
        android:singleLine="true" />
    <EditText
        android:id="@+id/etMessage"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_margin="5dp"
        android:gravity="top|start"
        android:hint="Compose Email"
        android:inputType="textMultiLine" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <Button
        android:id="@+id/btSend"
        android:layout_width="80dp"
        android:layout_height="50dp"
        android:layout_margin="5dp"
        android:text="Send" />
    <Button
        android:id="@+id/btAttachment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:text="attachment" />
    </RelativeLayout>
    <TextView
        android:id="@+id/tvAttachment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableStart="@drawable/ic_baseline_attach_file_24"
        android:visibility="gone" />
</LinearLayout>

3단계: 메인 액티비티 구현 (src/MainActivity.kt)

'첨부' 버튼을 누르면 갤러리에서 이미지를 선택하고, '보내기' 버튼을 누르면 입력된 내용과 함께 파일이 첨부된 이메일 인텐트가 실행되도록 구현합니다.

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
    lateinit var etEmail: EditText
    lateinit var etSubject: EditText
    lateinit var etMessage: EditText
    lateinit var send: Button
    lateinit var attachment: Button
    lateinit var tvAttachment: TextView
    lateinit var email: String
    lateinit var subject: String
    lateinit var message: String
    lateinit var uri: Uri
    private val pickFromGallery:Int = 101
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        etEmail = findViewById(R.id.etTo)
        etSubject = findViewById(R.id.etSubject)
        etMessage = findViewById(R.id.etMessage)
        attachment = findViewById(R.id.btAttachment)
        tvAttachment = findViewById(R.id.tvAttachment)
        send = findViewById(R.id.btSend)
        send.setOnClickListener { sendEmail() }
        attachment.setOnClickListener {
            openFolder()
        }
    }
    private fun openFolder() {
        val intent = Intent()
        intent.type = "image/*"
        intent.action = Intent.ACTION_GET_CONTENT
        intent.putExtra("return-data", true)
        startActivityForResult(Intent.createChooser(intent, "Complete action using"), pickFromGallery)
    }
    private fun sendEmail() {
        try {
            email = etEmail.text.toString()
            subject = etSubject.text.toString()
            message = etMessage.text.toString()
            val emailIntent = Intent(Intent.ACTION_SEND)
            emailIntent.type = "plain/text"
            emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
            emailIntent.putExtra(Intent.EXTRA_STREAM, uri)
            emailIntent.putExtra(Intent.EXTRA_TEXT, message)
            this.startActivity(Intent.createChooser(emailIntent, "Sending email..."))
        }
        catch (t: Throwable) {
            Toast.makeText(this, "Request failed try again: $t", Toast.LENGTH_LONG).show()
        }
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == pickFromGallery && resultCode == RESULT_OK) {
            if (data != null) {
                uri = data.data!!
            }
            tvAttachment.text = uri.lastPathSegment
            tvAttachment.visibility = View.VISIBLE
        }
    }
}

주요 포인트:

  • openFolder()ACTION_GET_CONTENT와 MIME 타입 image/*를 지정해 갤러리에서 이미지를 선택합니다.
  • sendEmail()ACTION_SEND 인텐트에 수신자(EXTRA_EMAIL), 제목(EXTRA_SUBJECT), 본문(EXTRA_TEXT), 첨부 파일(EXTRA_STREAM)을 담아 이메일 앱 chooser를 실행합니다.
  • onActivityResult() — 갤러리에서 돌아온 결과에서 파일 URI를 추출하고, 화면에 첨부 파일명을 표시합니다.

참고로 startActivityForResult()는 최신 안드로이드에서 deprecated되었으므로, 새 프로젝트에서는 ActivityResultContracts.GetContent()와 같은 Activity Result API 사용을 권장합니다.

4단계: 매니페스트 권한 설정 (androidManifest.xml)

인터넷 통신과 외부 저장소의 파일 읽기를 위해 아래와 같이 필요한 권한을 선언합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run ▶ 아이콘을 클릭하세요. 목록에서 자신의 모바일 기기를 선택하면 앱이 설치·실행됩니다.

앱이 실행되면 수신자 이메일 주소와 제목, 본문을 입력하고 attachment 버튼을 눌러 갤러리에서 이미지를 선택합니다. 그런 다음 Send 버튼을 누르면 이메일 앱 chooser가 나타나고, 선택한 파일이 첨부된 상태로 이메일이 전송됩니다.

코틀린(Kotlin)으로 안드로이드에서 파일 첨부 이메일 전송하는 방법

코틀린(Kotlin)으로 안드로이드에서 파일 첨부 이메일 전송하는 방법

코틀린(Kotlin)으로 안드로이드에서 파일 첨부 이메일 전송하는 방법