신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

안드로이드 SMS 문자 받기

SMS 문자가 오면 문자를 보낸 발신번호와 내용, 시간을 출력해주는 기능을 만들어 봅니다. 일단 BroadcastReceiver를 상속받는 SmsReceiver를 만들어 줍니다.

 

new > Other > Broadcast Receiver

 

만들고 나면 onReceiver 메소드같이 오버라이드 되면서 생성됩니다. 기능에 대한 내용은 이 메소드 안에 작성하면 됩니다.

 

SmsReceiver를 만들고 나서 AndroidManifest.xml에 추가해줘야 하는 부분이 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tistory.hongku.mysmsreceiver">

    <uses-permission android:name="android.permission.RECEIVE_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="SMS 리시버"
        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>

        <receiver
            android:name=".SmsReceiver"
            android:enabled="true">
            <intent-filter android:priority="1">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name=".SmsActivity"
            android:label="SMS"></activity>
    </application>

</manifest>​

 

추가해야하는 부분만 따로 보면...

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<intent-filter android:priority="1">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>

위 2개를 넣어주셔야 합니다.

 

SmsReceiver.java 코드는 아래와 같습니다.

package com.tistory.hongku.mysmsreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SmsReceiver extends BroadcastReceiver {

    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "SmsReceiver";

    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    @Override
    public void onReceive(Context context, Intent intent) {
        // SMS_RECEIVED에 대한 액션일때 실행
        if (intent.getAction().equals(SMS_RECEIVED)) {
            Log.d(TAG, "onReceiver() 호출");
            
            // Bundle을 이용해서 메세지 내용을 가져옴
            Bundle bundle = intent.getExtras();
            SmsMessage[] messages = parseSmsMessage(bundle);
            // 메세지가 있을 경우 내용을 로그로 출력해 봄
            if (messages.length > 0) {
                // 메세지의 내용을 가져옴
                String sender = messages[0].getOriginatingAddress();
                String contents = messages[0].getMessageBody().toString();
                Date receivedDate = new Date(messages[0].getTimestampMillis());
                
                // 로그를 찍어보는 과정이므로 생략해도 됨
                Log.d(TAG, "Sender :" + sender);
                Log.d(TAG, "contents : " + contents);
                Log.d(TAG, "receivedDate : " + receivedDate);

                // 액티비티로 메세지의 내용을 전달해줌
                sendToActivity(context, sender, contents, receivedDate);
            }
        }
    }

    // 액티비티로 메세지의 내용을 전달해줌
    private void sendToActivity(Context context, String sender, String contents, Date receivedDate){
        Intent intent = new Intent(context, SmsActivity.class);

        // Flag 설정
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // 메세지의 내용을 Extra에 넣어줌
        intent.putExtra("sender", sender);
        intent.putExtra("contents", contents);
        intent.putExtra("receivedDate", format.format(receivedDate));
        
        context.startActivity(intent);
    }

    private SmsMessage[] parseSmsMessage(Bundle bundle){
        Object[] objs = (Object[]) bundle.get("pdus");
        SmsMessage[] messages = new SmsMessage[objs.length];

        for(int i=0; i<objs.length; i++) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String format = bundle.getString("format");
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i], format);
            } else {
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
            }
        }

        return messages;
    }

}​

 

activity_sms.xml

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/senderText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:hint="발신번호"
        android:inputType="textPersonName" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="19dp"
        android:text="닫기" />

    <EditText
        android:id="@+id/receivedDateText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"
        android:layout_marginBottom="75dp"
        android:ems="10"
        android:hint="수신시각"
        android:inputType="textPersonName" />

    <EditText
        android:id="@+id/contentsText"
        android:layout_width="match_parent"
        android:layout_height="344dp"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/senderText"
        android:ems="10"
        android:hint="내용"
        android:inputType="textPersonName" />
</RelativeLayout>
​

 

결과

앱을 실행하면 SMS에 대한 권한을 받아야 합니다.

 

권한 허락을 누르면 위와 같은 토스트 메세지가 나옵니다.

 

권한을 받고 가상 에뮬레이터에 가상 문자를 보내봅니다.

 

정상적으로 값들이 화면에 출력됩니다.

 

만약 권한을 거부한 경우...

문자가 와도 화면에 출력되지 않습니다.

 

 

 

 

 

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기