이번에는 애플리케이션을 실행하여 버튼을 눌렀을 때, 메시지 화면으로 이동하고, 메시지를 작성하여 다른 사람에게 보내는 것을 해보도록 하겠습니다.

또한 다른 사람으로부터 문자가 왔을 때, 기존의 문자앱에서 보여지는 것 외에, 애플리케이션에서 또한 해당 문자에 대한 내용을 알려주도록 하는 것을 구성해보도록 하겠습니다.


[AndroidManifest.xml]

user-permission 으로 아래와 같이 추가해주면 됩니다.

<!-- SMS 부분 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />


그리고 Activity로 SMSActivity, ShowSMSActivity를 아래와 같이 추가해줍니다. ".sms.SMSActivity" 는, 안드로이드 스튜디오에서 sms라는 패키지를 새로 만들어 준 후, 그 안에 SMSActivity를 추가해주었기 때문입니다. 만약 SMSActivity를 MainActivity와 같은 패키지에 만들어 주었다면 ".SMSActivity" 로 해주시면 됩니다.

<activity android:name=".sms.SMSActivity" />
<activity android:name=".sms.ShowSMSActivity" />


또한, Receiver를 등록하여 다른 사람들로부터 SMS가 왔을 때에도 서비스를 해주어야 하므로

다음과 같이 receiver를 등록해줍니다.

<!-- Receiver 부분 -->
<!-- SMS 부분 -->
<receiver android:name=".sms.SMSBroadcast">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>


////////////////////////////////////////////////////////////////////////////////////////////////


[MainActivity.class]

public class MainActivity extends Activity {

private Button smsBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);                

//activity_main 레이아웃에서 버튼을 하나 만들어주면 됩니다! 버튼의 id는 아래와 같이 btn_sms 로 해주시면 됩니다.


smsBtn = (Button)findViewById(R.id.btn_sms);


smsBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent(MainActivity.this, SMSActivity.class);

startActivity(intent);

}

});

}

}


////////////////////////////////////////////////////////////////////////////////////////////////


[sms 패키지 내에 있는 SMSActivity.class]

public class SMSActivity extends Activity {
//SMS
Context mContext;
EditText smsNumber, smsTextContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms);

mContext = this;

smsNumber = (EditText)findViewById(R.id.smsNumber);
smsTextContext = (EditText)findViewById(R.id.smsText);
}

//SMS Send 해주는 부분!
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();
}
}

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:
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);
}
}


////////////////////////////////////////////////////////////////////////////////////////////////


[sms패키지 내에 위치한 SMSBroadcast.class]

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class SMSBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context mContext, Intent intent) {
String action = intent.getAction();

if("android.provider.Telephony.SMS_RECEIVED".equals(action)){
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]);
}

Date curDate = new Date(smsMessage[0].getTimestampMillis());
SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy년 MM월 HH시 mm분 ss초 ", Locale.KOREA);

String originDate = mDateFormat.format(curDate);
String origNumber = smsMessage[0].getOriginatingAddress();
String Message = smsMessage[0].getMessageBody().toString();

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);
}
}
}


[sms패키지 내에 위치한 ShowSMSActivity.class]

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;


public class ShowSMSActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_sms);

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);
}
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


[activity_show_sms.xml]

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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>


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


[activity_sms.xml]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
android:orientation="vertical" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="받는사람" />

<EditText
android:id="@+id/smsNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="phone" >
<requestFocus />
</EditText>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="링크를 전송합니다" />

<EditText
android:id="@+id/smsText"
android:layout_width="match_parent"
android:layout_height="200dp"
android:ems="10" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="sendSMS"
android:text="Send" />
</LinearLayout>



WRITTEN BY
SiriusJ

,