기본 콘텐츠로 건너뛰기

SMS 보내고 받기

출처 : http://www.androes.com/69
 이미 안드로이드사이드를 통해 한글 번역판이 공개되어 있지만 저와 같은 초보개발자를 위해 좀 더 간추려 보았습니다. 근데 정리하고나니 큰 차이는 없는듯..ㅋㅋ 
해당 소스는 현재 작업중인 저의 4번째 어플 기능중 일부분으로써 이번에 작업하면서 리팩토링하셨다고 보면 됩니다.
 일단 AndroidManifest.xml 파일에
 "SEND_SMS / RECEIVE_SMS" 2가지 권한을 추가합니다.
 * AndroidManifest.xml - Permissions 을 추가하여 안드로이드에서 해당 기능을 이용할 수 있도록 정의 - Permissions 항목 정의 및 종류는 http://www.androes.com/66 를 참고하세요!! * sms_send.xml - SMS 보내기 UI 정의 * SmsSender.java - Main Activity 파일로 실제 sms UI 및 처리를 담당 - 번호와 메세지가 정상적으로 입력되면 sendSMS(phoneNo, message)를 통해 처리 - 전송과정을 Toast를 통해 모니터링 하고 싶다면 sendSMS() 함수를, 원치 않으면 __sendSMS()를 이용하시면 됩니다.
 - 다른 클래스들과는 다르게 SmsManager 클래스를 사용하는데 이클래스는 직접적으로 초기화 하지 않으므로 SmsManger 객체를 얻을수 있는 정적 메소드인 getDefault() 를 호출하여 사용하게 됩니다.
 sendTextMessage() 메소드를 이용하여 PendingIntent 와 함께 SMS 메시지를 전송하게 됩니다.
 PendingIntent 객체는 메시지를 전송한후에 다른 액티비티를 보여주기 위해서 사용됩니다.
 모니터링을 하기위해 PendingIntent 와 함께 두개의 BroadcastReceiver 객체가 사용됩니다. PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); * SmsSender.java Full Source package com.androes.imhere; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class SmsSender extends Activity { Button btnSendSMS; EditText txtPhoneNo; EditText txtMessage; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sms_send); btnSendSMS = (Button) findViewById(R.id.button); txtPhoneNo = (EditText) findViewById(R.id.phone); txtMessage = (EditText) findViewById(R.id.message); btnSendSMS.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String phoneNo = txtPhoneNo.getText().toString(); String message = txtMessage.getText().toString(); if (phoneNo.length()>0 && message.length()>0) sendSMS(phoneNo, message); else Toast.makeText(getBaseContext(), "Please enter both phone number and message.", Toast.LENGTH_SHORT).show(); } }); } // SMS를 전송하는 과정을 모니터링하고 싶다면 private void sendSMS(String phoneNumber, String message) { String SENT = "SMS_SENT"; String DELIVERED = "SMS_DELIVERED"; PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new 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(), "SMS sent", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_NULL_PDU: Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show(); break; case SmsManager.RESULT_ERROR_RADIO_OFF: Toast.makeText(getBaseContext(), "Radio off", 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(), "SMS delivered", Toast.LENGTH_SHORT).show(); break; case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show(); break; } } }, new IntentFilter(DELIVERED)); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); } // 모니터링 안하고 발송을 원한다면 아래 함수를 이용 private void __sendSMS(String phoneNumber, String message) { PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, SmsSender.class), 0); SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, pi, null); } } * SmsReceiver.java - SMS 메시지를 받을때 onCreate() 메소드가 호출 될 것입니다. - SMS 메시지는 번들 객체를 통해 Intent 객체(onReceive() 메소드의 두번째 파라미터)에 포함되어 있습니다. - 이 메시지는 PDU 포맷으로 Object array 에 저장되어있습니다. - 이 메시지를 가져오기 위해서는, SmsMessage 클래스로부터 정적 메소드인 createFromPdu()를 사용합니다. - SMS 메시지는 Toast 클래스를 사용하여 보여집니다. package com.androes.imhere; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.widget.Toast; public class SmsReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage[] msgs = null; String str = ""; if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage[pdus.length]; for (int i=0; i

댓글

이 블로그의 인기 게시물

[Java] Http File Download 이어받기

Http 서버로부터 다운로드 받는 파일을 이어받기 위해서는 Http Header에 아래 두가지 정보를 추가해 주면 된다. URLConnection conn = url.openConnection(); conn.setRequestProperty("Accept-Ranges", "bytes"); conn.setRequestProperty("Range", "bytes=" + mOffset + "-"); 그러면 서버에서는 해당 Offset으로부터 File을 다운로드 시켜준다. 클라이언트가 요청헤더에 Range 필드를 포함 시켜서 보내면, 서버는 그 정보를 가지고 어디서 부터 파일을 보낼지 판단을 합니다. 하지만 클라이언트가(브라우저) Range 필드를 포함 시켜야 할지를 판단하는 기준은 최초 다운로드 요청시 서버의 응답헤더에 따라 다음 요청헤더에 Range 헤더를 생성할지 않할지 판단하게 됩니다. 그걸 당락짓는 응답 헤더 필드는 다음과 같습니다. Accept-Ranges , ETag, Last-Modified 반드시 위 필드를 응답 헤더에 같이 보내줘야 클라이언트는 다음 요청시 Range헤더를 포함시켜 보내게 됩니다. 참고로 말씀 드리면 위 필드를 포함 시켜서 보내더라도 value는 반드시 " " 로 묶어서 보내야 합니다. 안그러면 브라우저는 죽어도 Range 필드를 생성시키지 않습니다. HTTP 1.1 스펙은 따옴표를 강제적으로 해줘라 이런 내용 없습니다. 자바기준 40byte의 파일이라치면 클리이언트 요청을 두번으로 나누었다치면 이케 connection.setRequestProperty("Range", "bytes=0-20"); connection.setRequestProperty("Range", "bytes=20-40"); 단 co...

java 특정 디렉토리에 있는 파일 목록을 읽어내기, 정렬해서 가져오기

폴더 리스트 가져오기 String path="C:\"; File dirFile=new File(path); File []fileList=dirFile.listFiles(); for(File tempFile : fileList) {   if(tempFile.isFile()) {     String tempPath=tempFile.getParent();     String tempFileName=tempFile.getName();     System.out.println("Path="+tempPath);     System.out.println("FileName="+tempFileName);     /*** Do something withd tempPath and temp FileName ^^; ***/   } } 정렬해서 가져오기 import java.io.FileFilter; import java.io.IOException; import java.util.Arrays; import java.util.Date; import org.apache.commons.io.comparator.LastModifiedFileComparator; import org.apache.commons.io.filefilter.FileFileFilter; public class LastModifiedFileComparatorTest { public static void main(String[] args) throws IOException { File directory = new File("."); // get just files, not directories File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE); System.out.println("Defaul...