신규 블로그를 만들었습니다!
안드로이드 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에 대한 권한을 받아야 합니다.
권한 허락을 누르면 위와 같은 토스트 메세지가 나옵니다.
권한을 받고 가상 에뮬레이터에 가상 문자를 보내봅니다.
정상적으로 값들이 화면에 출력됩니다.
만약 권한을 거부한 경우...
문자가 와도 화면에 출력되지 않습니다.
관련 글
2018/06/14 - [Android] - Andorid :: 안드로이드 라이프 사이클 (Life Cycle)
2018/06/12 - [Android] - Android :: 안드로이드 버튼을 이용해서 이미지 전환하기
2018/06/12 - [Android] - Android :: 안드로이드 다른 뷰 화면 띄어주기
2018/06/12 - [Android] - Android :: 안드로이드 버튼을 눌러 웹 페이지 띄우기
2018/06/12 - [Android] - Android :: 안드로이드 버튼을 눌러 토스트 메세지 띄우기
'Mobile > Android' 카테고리의 다른 글
Andorid :: 안드로이드 라이프 사이클 (Life Cycle) (2) | 2018.06.14 |
---|---|
Android :: 안드로이드 버튼을 이용해서 이미지 전환하기 (4) | 2018.06.12 |
Android :: 안드로이드 다른 뷰 화면 띄어주기 (4) | 2018.06.12 |
Android :: 안드로이드 버튼을 눌러 웹 페이지 띄우기 (5) | 2018.06.12 |
Android :: 안드로이드 버튼을 눌러 토스트 메세지 띄우기 (2) | 2018.06.12 |
최근댓글