본문 바로가기

Programming/android

안드로이드 문자보내기 (1)


문자를 보내는 방법은, 다음과 같다.

1. AndroidManifest.xml 파일에 퍼미션을 추가한다.

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


2. 자바 코드에 코드를 추가한다.
전화기능이 없는 갤탭 10인치에서는 NoService가 옴. 

public class MainActivity extends Activity {
private Button btnSendSMS; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViewById(R.id.btnSendSMS).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS("01012345678", "Send, sms, please.!");
}
});
    }
    
    /**
     * 문자를 보내는 메소드
     * @param phoneNumber
     * @param message
     */
    private void sendSMS(String phoneNumber, String message){
    
     String SENT = "SMS_SENT";
     String DELIVERED = "SMS_DELIVERED";
     
 
       // 문자 보내는 상태를 감지하는 PendingIntent
     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
        // 문자 받은 상태를 감지하는 PendingIntent
     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
       
 
       // 문자 보내는 상태를 감지하는 BroadcastReceiver를 등록한다.
     registerReceiver(new BroadcastReceiver() {

                       // 문자를 수신하면, 발생. 

@Override
public void onReceive(Context context, Intent intent) {
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));
    
     // 문자를 받는 상태를 확인하는 BroadcastReceiver를 등록.
     registerReceiver(new BroadcastReceiver() {

                        // 문자를 받게 되면, 불린다. 
@Override
public void onReceive(Context context, Intent intent) {
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를 가져온다.
     SmsManager sms = SmsManager.getDefault();
        // sms를 보낸다. 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    
    }
}


※ 문자를 보내는 메소드 설명.
 

sms.sendTextMessage(String destinationAddress, scAddress, Stringn text, PendingIntent sendIntent, deliveryIntent);

destinationAddress, phoneNumber,
scAddress - Service center address, use null for default SMSC
text - SMS message
sendIntent - pending intent to invoke when the message is sent
deliveryIntent - pending intent to invoke when the message has been delivered.

만약, 문자를 수신하는상태 및 보낸 상태를 파악하고 싶지 않으면, sendIntent, deliveryIntent를 null로 주면 된다.

※ 문자를 보내는 기능이 없는 갤럭시 탭 와이파이 버전같은 경우, 

SmsManager.RESULT_ERROR_NO_SERVICE:  콜백이 onReceive에서 온다.

관련글.
2011/12/30 - [Programming/android] - 안드로이드 문자 보내기 (2)