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

Kotlin으로 안드로이드 듀얼 SIM 스마트폰에서 SmsManager를 활용해 문자(SMS) 보내기

이 튜토리얼에서는 Kotlin을 사용하여 안드로이드 앱에서 SmsManager 클래스로 문자 메시지(SMS)를 전송하는 방법을 단계별로 알아봅니다. 예제 코드는 듀얼 SIM 스마트폰 환경에서도 동작하며, 기본 SIM(디폴트 서브스크립션)을 통해 메시지가 발송됩니다.

주요 구현 흐름

  • SMS 전송 권한(SEND_SMS) 요청 및 확인
  • 전화번호와 메시지 입력값 유효성 검사
  • SmsManager를 이용한 실제 메시지 발송

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력하여 새 프로젝트를 생성합니다.

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

화면에는 전화번호 입력란, 메시지 입력란, 그리고 전송 버튼이 포함된 간단한 LinearLayout을 구성합니다.

<?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="match_parent"
    android:orientation="vertical"
    android:padding="4dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editTextNum"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter mobile number"
        android:textColor="@android:color/black" />

    <EditText
        android:id="@+id/editTextMsg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your message"
        android:textColor="@android:color/black" />

    <Button
        android:id="@+id/btnSendMsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="5dp"
        android:onClick="sendMessage"
        android:text="Send Message" />

</LinearLayout>

3단계 — 메인 액티비티 작성 (src/MainActivity.kt)

아래 코드는 권한 확인 → 입력값 검증 → SMS 발송의 순서로 동작합니다. 권한이 없으면 사용자에게 권한을 요청하고, 결과에 따라 메시지를 발송하거나 안내 문구를 표시합니다.

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.telephony.SmsManager
import android.text.TextUtils
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {

    lateinit var button: Button
    lateinit var editTextNumber: EditText
    lateinit var editTextMessage: EditText
    private val permissionRequest = 101

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        editTextNumber = findViewById(R.id.editTextNum)
        editTextMessage = findViewById(R.id.editTextMsg)
        button = findViewById(R.id.btnSendMsg)
    }

    fun sendMessage(view: View) {
        val permissionCheck =
            ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            myMessage()
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.SEND_SMS),
                permissionRequest
            )
        }
    }

    private fun myMessage() {
        val myNumber: String = editTextNumber.text.toString().trim()
        val myMsg: String = editTextMessage.text.toString().trim()

        if (myNumber == "" || myMsg == "") {
            Toast.makeText(this, "Field cannot be empty", Toast.LENGTH_SHORT).show()
        } else {
            if (TextUtils.isDigitsOnly(myNumber)) {
                val smsManager: SmsManager = SmsManager.getDefault()
                smsManager.sendTextMessage(myNumber, null, myMsg, null, null)
                Toast.makeText(this, "Message Sent", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Please enter the correct number", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == permissionRequest) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                myMessage()
            } else {
                Toast.makeText(
                    this,
                    "You don't have required permission to send a message",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    }
}

4단계 — 매니페스트 설정 (AndroidManifest.xml)

SMS를 전송하려면 반드시 SEND_SMS 권한을 매니페스트에 선언해야 합니다.

<?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.SEND_SMS" />

    <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 아이콘을 클릭하세요. 목록에서 자신의 모바일 기기를 선택하면 앱이 설치되고 실행됩니다.

번호와 메시지를 입력한 뒤 Send Message 버튼을 누르면, 권한 요청 다이얼로그가 먼저 나타나고 허용 후 문자가 발송됩니다.

Kotlin으로 안드로이드 듀얼 SIM 스마트폰에서 SmsManager를 활용해 문자(SMS) 보내기Kotlin으로 안드로이드 듀얼 SIM 스마트폰에서 SmsManager를 활용해 문자(SMS) 보내기

참고 사항

  • 듀얼 SIM 기기: 위 코드는 기본 SIM(default subscription)으로 메시지를 보냅니다. 특정 SIM을 지정하려면 API 31 이상에서 제공되는 SmsManager.getSmsManagerForSubscriptionId(subscriptionId)를 사용할 수 있습니다.
  • 긴 메시지: 70자(한글 기준)를 초과하는 메시지는 sendMultipartTextMessage()로 분할 전송하는 것이 좋습니다.
  • 권한: Android 6.0(API 23)부터 SEND_SMS는 런타임 권한이므로, 실행 중에 사용자 승인을 받아야 합니다.