1. AndroidManifest.xml 파일에 필요한 권한을 준다.
<uses-permission android:name="android.permission.RECEIVE_SMS" />
2. AndroidManaifest.xml 파일에 SMS를 수신할 리시버를 등록한다.
<receiver android:name="kr.inclass.smscapture.SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
즉... SMS가 도착하면 안드로이드가 SMSReceiver에게 그 사실을 알려준다.
3. 리시버는 BroadcastReceiver로부터 상속받아서 클래스를 만들어야 한다. 리시버 클래스를 만든다.
public class SMSReceiver extends BroadcastReceiver {
...
}
4. BroadcastReceiver는 onReceive 함수를 오버라이드해야 한다. 이 함수가 SMS 수신시 호출되는 함수이다. onReceive 함수를 오버라이드해준다.
private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; // 액션명을 문자열 상수로 정의해준다.
@Override
public void onReceive(Context context, Intent intent) {
String actionName = intent.getAction();
if ( ! actionName.equals(ACTION_SMS_RECEIVED) ) return; // 인텐트필터에 리시버가 호출되는 필터를 지정해줬는데, 왜 굳이 액션을 검사하는지는 모르겠다.
Bundle extras = intent.getExtras();
if ( extras == null ) return;
Object[] pdus = (Object[]) extras.get("pdus"); // 넘겨받은 인텐트의 extra데이터로 pdu 객체들이 넘어온다. pdu 객체란거는 sms 패킷단위이다. 즉, 수신된 sms의 정보를 담고 있는 패킷이다.
if ( pdus == null ) return;
SmsMessage[] msgs = new SmsMessage[pdus.length]; // 수신된 sms 객체갯수만큼 SmsMessage 객체를 생성한다.
for ( int i=0 ; i<pdus.length; i++ ) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); // pdu 객체로부터 SmsMessage 객체를 생성한다.
String number = msgs[i].getOriginatingAddress(); // 발신자의 전화번호를 얻는다.
String message = msg[i].getDisplayMessageBody().toString(); // 발신내용을 얻는다.
String date = getFormattedDate(msgs[i].getTimestampMillis()); // 발신한 시간을 구한다.
// 얻은 데이터로 필요한 처리를 한다. 주의할 점은 인터넷, 디스크IO 등과 같은 작업은 스레드로 처리해야 한다는 것이다. 그렇지 않으면 리시버가 죽는다.
}
}
// 타임스탬프를 보기편한 문자열로 변환
private String getFormattedDate(long timestampmiliseconds) {
final Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timestampmiliseconds);
return cal.getTime().toLocaleString();
}