문자 송수신 코드


문자 송수신 어플을 만들기 위해서는 아래 3단계는 필수이다.

1. 권한 설정 필요 (SMS 송수신을 다루기 위해서는 시스템으로부터 권한을 요청해야한다. AndroidMenifest.xml)

2. MessageReceiver 필요. (문자 수신)

3. SmsManager 필요. (문자 송신)

* 보낸 문자를 메세지함에 저장하는 경우 

2014년 이전 스마트폰은 각 통신사마다 문자를 저장하는 DB 경로가 달랐다. 그래서 저장하려면 각 통신사별로 DB경로를 알아내서 저장해야하는 불편함이 있었다. 




아래 세부사항을 확인해보자.


  • 문자 어플을 개발할 때 맨 처음 작성할 부분은 권한 설정이다.(AndroidMenifest.xml)

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

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

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

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




  • 문자를 송신하는 부분은 Activity에서 설정한다.

아래 코드는 실제 send버튼을 눌렀을 때의 동작에 관한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    String SENT = "SMS_SENT";     
    String DELIVERED = "SMS_DELIVERED";   
 
    PendingIntent sentPI = PendingIntent.getBroadcast(this0new Intent(SENT), 0);   
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this0new Intent(DELIVERED), 0);    
 
    //---when the SMS has been sent---    
    registerReceiver(new BroadcastReceiver(){         
        @Override        
        public void onReceive(Context arg0, Intent arg1) {            
            switch (getResultCode())            
            {               
                case Activity.RESULT_OK:   
                     Toast.makeText(getBaseContext(), "메세지를 성공적으로 보냈습니다.", Toast.LENGTH_SHORT).show();                   
                     break;             
                   case SmsManager.RESULT_ERROR_GENERIC_FAILURE:      
                    Toast.makeText(getBaseContext(), "메세지를 보내는데 실패했습니다.", Toast.LENGTH_SHORT).show();     
                    break;        
                case SmsManager.RESULT_ERROR_NO_SERVICE:            
                    Toast.makeText(getBaseContext(), "메세지를 보내는데 실패했습니다.", Toast.LENGTH_SHORT).show();  
                    break;             
                case SmsManager.RESULT_ERROR_NULL_PDU:            
                    Toast.makeText(getBaseContext(), "메세지를 보내는데 실패했습니다.", Toast.LENGTH_SHORT).show();              
                      break;     
                   case SmsManager.RESULT_ERROR_RADIO_OFF:               
                     Toast.makeText(getBaseContext(), "메세지를 보내는데 실패했습니다.", Toast.LENGTH_SHORT).show();                
                    break;           
             }       
         }   
     }, new IntentFilter(SENT));   
 
     //---when the SMS has been delivered---    
    registerReceiver(new BroadcastReceiver(){
         @Override        
         public void onReceive(Context arg0, Intent arg1) {    
             switch (getResultCode())      
             {                
 
                case Activity.RESULT_OK:                
                    Toast.makeText(getBaseContext(), "메세지를 성공적으로 보냈습니다.", Toast.LENGTH_SHORT).show(); 
                    break;              
                case Activity.RESULT_CANCELED:     
                       Toast.makeText(getBaseContext(), "메세지를 보내는데 실패했습니다.", Toast.LENGTH_SHORT).show();       
                    break;                              
                }       
         }    
    }, new IntentFilter(DELIVERED));
    
    // 실제 문자를 발송하는 코드(sentPI, deliveredPI 의 용도는 성공적으로 메세지 송신한 경우 혹은 실패했다라는 결과값을 받기 위해)   
    SMSManager smsManager = SmsManager.getDefault(); //문자 관리하는 객체 생성  
      smsManager.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
cs





  • 문자를 수신하는 코드는 Receiver 파일 형태로 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Vibrator;
import android.telephony.SmsMessage;
import android.util.Log;
 
public class MessageReceiver extends BroadcastReceiver
{
  private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
  
  
  public void onReceive(Context paramContext, Intent paramIntent)
  {
    Log.e("MessageReceiver""=====onReceive");
    if (paramIntent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
    {
      Bundle bundle = paramIntent.getExtras();
      if (bundle == null) {
        return;
      }
      
      Object[] pdus = (Object[])bundle.get("pdus");
    SmsMessage[] arrayOfSmsMessage = new SmsMessage[pdus.length];
    int i = 0;
    while (i < arrayOfSmsMessage.length)
    {
      arrayOfSmsMessage[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
      String msgBody = arrayOfSmsMessage[i].getMessageBody().toString();
      String phoneNumber = arrayOfSmsMessage[i].getOriginatingAddress();
      Log.e("MessageReceiver""onReceive msg : " + (String)msgBody + " phoneNumber : " + phoneNumber);
      playSound(paramContext);
      
      Intent showSMSIntent = new Intent(paramContext, MainActivity.class);
 
      showSMSIntent.putExtra("Message", (String)msgBody);
      showSMSIntent.putExtra("PhoneNumber", phoneNumber);
      showSMSIntent.putExtra("ReceivedSMS"true);
      showSMSIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      
      paramContext.startActivity(showSMSIntent);
      i += 1;
    }
  }
 }
}
 
 
cs


블로그 이미지

미네르바98

안드로이드와 영화 리뷰, 생활정보에 관한 내용을 기재합니다.

,