이것Do! 저것Do!!

“File > New > Class”를 선택하고 아래와 같이 구성한다.



SmsReceiver.java를 열어보면 아래와 같은 코드가 생성된 것을 볼 수 있다.

   1: /**
   2:  * @project ShowMeSms
   3:  */
   4: package diy.myapps.android;
   5:  
   6: import android.content.BroadcastReceiver;
   7: import android.content.Context;
   8: import android.content.Intent;
   9:  
  10: /**
  11:  * @author Chaotic21c
  12:  *
  13:  */
  14: public class SmsReceiver extends BroadcastReceiver {
  15:     /* (non-Javadoc)
  16:      * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent)
  17:      */
  18:     @Override
  19:     public void onReceive(Context context, Intent intent) {
  20:         // TODO Auto-generated method stub
  21:     }
  22: }


현재, BroadcastReceiver를 extends하여 receiver를 구현하려고 한다. 이를 위해서는 먼저 permission과 intent-filter의 등록이 필요하다. AndroidManifest.xml에 아래의 내용을 추가해 준다.

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3:       package="diy.myapps.android"
   4:       android:versionCode="1"
   5:       android:versionName="1.0">
   6:       
   7:     <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
   8:     
   9:     <application android:icon="@drawable/icon" android:label="@string/app_name">
  10:         <activity android:name=".ShowMeSms"
  11:                   android:label="@string/app_name">
  12:             <intent-filter>
  13:                 <action android:name="android.intent.action.MAIN" />
  14:                 <category android:name="android.intent.category.LAUNCHER" />
  15:             </intent-filter>
  16:         </activity>
  17:         <receiver android:name="SmsReceiver">
  18:             <intent-filter>
  19:                 <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
  20:             </intent-filter>
  21:         </receiver>
  22:     </application>
  23: </manifest> 

이것으로 ShowMeSms에서 sms를 수신하기 위한 아주 기본적인 조치는 끝났다.

이제, 실제 sms를 받았을 때 어떻게 처리할 지에 대한 구현을 해 보자.

 

다시 SmsReceiver class로 돌아가서 onReceive() method를 아래의 내용으로 채운다.

   1: public void onReceive(Context context, Intent intent) {
   2:     Log.d(LOGTAG, "onReceive() received action = " + intent.getAction());
   3:     
   4:     Bundle bundle = intent.getExtras();
   5:     SmsMessage[] msg = null;
   6:     String content = "";
   7:     if (bundle != null)
   8:     {
   9:         Object[] pdus = (Object[]) bundle.get("pdus");
  10:         msg = new SmsMessage[pdus.length];
  11:         for (int i=0; i<msg.length; i++)
  12:         {
  13:             msg[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
  14:             content = "From: " + msg[i].getOriginatingAddress() + "\n";
  15:             content += "Message: " + msg[i].getMessageBody().toString();
  16:         }
  17:         
  18:         Toast.makeText(context, content, Toast.LENGTH_LONG).show();
  19:     }
  20: }

 

모든 내용을 저장하고 bin 디렉토리 아래에 생성된 ShowMeSms.apk를 설치하여 테스트를 해 보자.

디자이어 HD에 adb install로 설치를 한 후 ddms로 메시지가 화면에 나타나는 것을 capture한 것이다.


Toast를 만지작 거리다가 "왜 duration은 LENGTH_SHORT하고 LENGTH_LONG 밖에 없을까?"라는 의구심이 들어 검색을 해 보았다.

이 궁금증에 대한 답이 여기에 있는 듯 하다.

- 안드로이드 Toast가 수상하다