어플에서 SMS(문자) 전송 하기
27. 어플에서 SMS(문자) 전송 하기
이 강좌를 모두 마스터 한다면 위 사진처럼 진짜 문자 전송이 되는 앱을 만들수 있습니다
1 2 3 4 5 6 7 8 9 10 | public void sendSMS(View v){ String smsNum = smsNumber.getText().toString(); String smsText = smsTextContext.getText().toString(); if (smsNum.length()> 0 && smsText.length()> 0 ){ sendSMS(smsNum, smsText); } else { Toast.makeText( this , "모두 입력해 주세요" , Toast.LENGTH_SHORT).show(); } } |
2~3줄의 getText().toString()은 모두 아시는 구문이죠?
모르신다면 [Development/App] - #7 EditText는 완전 쉬워요~ 부터 보시길 추천드립니다
- destinationAddress : 받는사람의 Phone Number입니다 신기하게도 String형식입니다
- scAddress : 이건 잘 모르겠습니다 일단 null을 입력해 주세요 (구글API : is the service center address or null to use the current default SMSC)
- text : 문자의 내용입니다
- sentIntent : 문자 전송에 관련한 PendingIntent입니다 null을 넣어도 되지만 저는 전송 확인결과를 알아보기 위해 이것도 사용할 예정입니다
- deliveryIntent : 문자 도착에 관련한 PendingIntent라고 합니다 null을 넣어도 되지만 한번 이것도 사용해 보겠습니다
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 | public void sendSMS(String smsNumber, String smsText){ PendingIntent sentIntent = PendingIntent.getBroadcast( this , 0 , new Intent( "SMS_SENT_ACTION" ), 0 ); PendingIntent deliveredIntent = PendingIntent.getBroadcast( this , 0 , new Intent( "SMS_DELIVERED_ACTION" ), 0 ); registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()){ case Activity.RESULT_OK: // 전송 성공 Toast.makeText(mContext, "전송 완료" , Toast.LENGTH_SHORT).show(); break ; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: // 전송 실패 Toast.makeText(mContext, "전송 실패" , Toast.LENGTH_SHORT).show(); break ; case SmsManager.RESULT_ERROR_NO_SERVICE: // 서비스 지역 아님 Toast.makeText(mContext, "서비스 지역이 아닙니다" , Toast.LENGTH_SHORT).show(); break ; case SmsManager.RESULT_ERROR_RADIO_OFF: // 무선 꺼짐 Toast.makeText(mContext, "무선(Radio)가 꺼져있습니다" , Toast.LENGTH_SHORT).show(); break ; case SmsManager.RESULT_ERROR_NULL_PDU: // PDU 실패 Toast.makeText(mContext, "PDU Null" , Toast.LENGTH_SHORT).show(); break ; } } }, new IntentFilter( "SMS_SENT_ACTION" )); registerReceiver( new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()){ case Activity.RESULT_OK: // 도착 완료 Toast.makeText(mContext, "SMS 도착 완료" , Toast.LENGTH_SHORT).show(); break ; case Activity.RESULT_CANCELED: // 도착 안됨 Toast.makeText(mContext, "SMS 도착 실패" , Toast.LENGTH_SHORT).show(); break ; } } }, new IntentFilter( "SMS_DELIVERED_ACTION" )); SmsManager mSmsManager = SmsManager.getDefault(); mSmsManager.sendTextMessage(smsNumber, null , smsText, sentIntent, deliveredIntent); } |
두번째~세번째 줄의 PendingIntent에 대해 따로 때어내어 설명하도록 하겠습니다
PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT_ACTION"), 0);
PendingIntent deliveredIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED_ACTION"), 0);
[Development/App] - #24 Broadcast Receiver로 문자(SMS) 수신해보자
뭐.. 이런씩으로 말이죠
브로드 캐스트 리시버에서 어떤 작업이 이루어 지는지는 주석으로 설명이 되어 있으니 더이상의 설명은 필요 없을듯 합니다
저는 이렇게 TableLayout을 이용해서 구현했습니다
이 레이아웃은 한번도 써본적이 없으신 분들을 위해 코드를 제공하겠습니다
res/layout/activity_showsms.xml
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 56 57 58 59 60 61 62 63 | android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:paddingBottom = "@dimen/activity_vertical_margin" android:paddingLeft = "@dimen/activity_horizontal_margin" android:paddingRight = "@dimen/activity_horizontal_margin" android:paddingTop = "@dimen/activity_vertical_margin" tools:context = ".ShowSMSActivity" > < TableRow android:layout_width = "wrap_content" android:layout_height = "wrap_content" > < TextView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "발신자" /> < TextView android:id = "@+id/originNum" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginLeft = "20dp" /> </ TableRow > < TableRow android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginTop = "20dp" > < TextView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "수신 시각" /> < TextView android:id = "@+id/smsDate" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginLeft = "20dp" /> </ TableRow > < TableRow android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginTop = "20dp" > < TextView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "수신 내용" /> < TextView android:id = "@+id/originText" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_marginLeft = "20dp" /> </ TableRow > </ TableLayout > |
그다음에 브로드캐스트리시버를 작성합시다
이름은 SMSBroadCast.java입니다
1 2 3 4 5 6 7 8 9 10 11 12 13 | import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class Broadcast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ( "android.provider.Telephony.SMS_RECEIVED" .equals(action)){ } } } |
자, 저 if문에 문자 수신을 위한 코드를 작성해 봅시다
저번에도 말씀드렸지만 이해하려고는 하지 마세요
1 2 3 4 5 6 7 | Bundle bundle = intent.getExtras(); Object messages[] = (Object[])bundle.get( "pdus" ); SmsMessage smsMessage[] = new SmsMessage[messages.length]; for ( int i = 0 ; i < messages.length; i++) { smsMessage[i] = SmsMessage.createFromPdu(( byte [])messages[i]); } |
그다음에는 저 SmsMessage에서 발신자와, 수신시각, 수신 메세지를 얻어와야 합니다
1 2 3 4 5 6 | Date curDate = new Date(smsMessage[ 0 ].getTimestampMillis()); SimpleDateFormat mDateFormat = new SimpleDateFormat( "yyyy년 MM월 dd일 HH시 mm분 ss초" , Locale.KOREA); String originDate = mDateFormat.format(curDate); String origNumber = smsMessage[ 0 ].getOriginatingAddress(); String Message = smsMessage[ 0 ].getMessageBody().toString(); |
SimpleDateFormat은 얻어온 날짜를 년, 월, 일 형식에 맞게 변환해 줍니다
이에 대한 지식은 어플지식이 아니라 java지식이므로 검색해 주세요
4번 라인에서 mDateFormat.format으로 날짜 형식을 변환합니다
1 2 3 4 5 6 7 8 | Intent showSMSIntent = new Intent(mContext, ShowSMSActivity. class ); showSMSIntent.putExtra( "originNum" , origNumber); showSMSIntent.putExtra( "smsDate" , originDate); showSMSIntent.putExtra( "originText" , Message); showSMSIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(showSMSIntent); |
putExtra(name, value)은 name과 값을 입력하여 Intent로 실행한 액티비티(또는 서비스등)에서 값을 가져올수 있습니다
번호, 시각, 내용을 putExtra로 집어넣고 있으며
브로드캐스트에서 액티비티를 실행하므로 setFlags를 이용합니다
마지막으로 액티비티를 실행하면 브로드캐스트로 할일은 끝입니다
1 2 3 4 5 6 7 8 9 10 11 12 13 | TextView smsDate = (TextView) findViewById(R.id.smsDate); TextView originNum = (TextView) findViewById(R.id.originNum); TextView originText = (TextView) findViewById(R.id.originText); Intent smsIntent = getIntent(); String originNumber = smsIntent.getStringExtra( "originNum" ); String originDate = smsIntent.getStringExtra( "smsDate" ); String originSmsText = smsIntent.getStringExtra( "originText" ); originNum.setText(originNumber); smsDate.setText(originDate); originText.setText(originSmsText); |
5번라인에서 Intent를 가져온후 7~9번을 보시면 putExtra로 넣은 값을 가져오고 있습니다
11~13번에서 Text를 적용하는 모습입니다
액티비티를 만들었으므로 AndroidManifest.xml에 추가해 줍시다
<activity android:name="whdghks913.tistory.examplesendsms.ShowSMSActivity" />
문자전송과 수신이 모두 정상적으로 이루어 지는것을 확인해 볼수 있습니다~
이글은 [] 에서 다시 보실수 있으며 원본 글의 저작권은 미르에게 있습니다
[출처] 미르의 IT 정복기 (http://itmir.tistory.com/458)
[첨부 파일]
'프로그래밍 > Android (Java)' 카테고리의 다른 글
DB연동 - XML 파싱을 이용한 Mysql 연동 (0) | 2015.10.08 |
---|---|
videoview streaming android example (0) | 2015.10.06 |
Preferences 를 이용한 자동 로그인 (0) | 2015.05.27 |
안드로이드 화면방향 설정하기 (0) | 2015.04.21 |
AVD 생성시 CPU "No system images installed for this target." (0) | 2015.04.16 |