본문 바로가기
개발/안드로이드

어플에서 문자(SMS) 메세지 보내기 & 받은 내용 분석하기

by darksilber 2012. 2. 6.
반응형

출처를 항상 함께 퍼가주세요.


출처 : http://www.mfamstory.com


=========================================================================================================================================


device.png


xml 레이아웃은 간단하기 때문에 생략하고,



#SmsSendActivity.java


public class SmsSendActivity extends Activity implements OnClickListener {

private final static String TAG = "SmsSendActivity";

private final static String SMS_SEND = "SMS_SEND";

private final static String SMS_DELIVER = "SMS_DELIVER";

Button mSend, mCancel;

EditText mPhoneNumber, mSendMessage;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.sms_send);

initLayout();

}

private void initLayout() {

mSend = (Button) findViewById(R.id.send);

mCancel = (Button) findViewById(R.id.send);

mPhoneNumber = (EditText) findViewById(R.id.phoneNumber);

mSendMessage = (EditText) findViewById(R.id.sendMessage);

mSend.setOnClickListener(this);

mCancel.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch(v.getId()){

case R.id.send :

String phoneNumber = mPhoneNumber.getText().toString();

String message = mSendMessage.getText().toString();

sendSMS(phoneNumber, message);

break;

case R.id.cancel :

mPhoneNumber.setText("");

mSendMessage.setText("");

break;

}

}

private void sendSMS(String phoneNumber, String message) {

PendingIntent sendPI = PendingIntent.getBroadcast(this, 0, new Intent(SMS_SEND), 0);

PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, new Intent(SMS_DELIVER), 0);

registerReceiver(SendSmsResult, new IntentFilter(SMS_SEND));

registerReceiver(DeliverSmsResult, new IntentFilter(SMS_DELIVER));

SmsManager sms = SmsManager.getDefault();

// 보내는사람, 통신사, 내용, 전송결과, 전송완료여부

sms.sendTextMessage(phoneNumber, null, message, sendPI, deliverPI);

// sms.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents);

// sms.sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);

mSendMessage.setText("");

}

BroadcastReceiver SendSmsResult = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

switch (getResultCode()) {

case Activity.RESULT_OK :

Toast.makeText(SmsSendActivity.this, "전송 성공", Toast.LENGTH_LONG).show();

break;

case SmsManager.RESULT_ERROR_GENERIC_FAILURE :

Toast.makeText(SmsSendActivity.this, "RESULT_ERROR_GENERIC_FAILURE", Toast.LENGTH_LONG).show();

break;

case SmsManager.RESULT_ERROR_NO_SERVICE :

Toast.makeText(SmsSendActivity.this, "RESULT_ERROR_NO_SERVICE", Toast.LENGTH_LONG).show();

break;

case SmsManager.RESULT_ERROR_NULL_PDU :

Toast.makeText(SmsSendActivity.this, "RESULT_ERROR_NULL_PDU", Toast.LENGTH_LONG).show();

break;

case SmsManager.RESULT_ERROR_RADIO_OFF :

Toast.makeText(SmsSendActivity.this, "RESULT_ERROR_RADIO_OFF", Toast.LENGTH_LONG).show();

break;

}

}

};

BroadcastReceiver DeliverSmsResult = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

switch (getResultCode()) {

case Activity.RESULT_OK :

Toast.makeText(SmsSendActivity.this, "Activity.RESULT_OK", Toast.LENGTH_LONG).show();

break;

case Activity.RESULT_CANCELED :

Toast.makeText(SmsSendActivity.this, "Activity.RESULT_CANCELED", Toast.LENGTH_LONG).show();

break;

}

}

};

}




대략 이런식으로 전송결과에 대한 2개의 BroadcastReceiver를 생성하고, PendingIntent를 이용해서 사용하면 되는듯.



================================================================================================================================================



메세지를 받을 때는,


#SmsReceiveActivity.java


public class SmsReceiveActivity extends Activity {

TextView mReceivedMessage;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.sms_receive);

mReceivedMessage = (TextView) findViewById(R.id.receivedMessage);

mReceivedMessage.setText("");

Intent intent = getIntent();

String message = intent.getStringExtra("SMS_RECEIVE");

mReceivedMessage.setText(message);

}

}



#SmsReceiver.java


public class SmsReceiver extends BroadcastReceiver {


@Override

public void onReceive(Context context, Intent intent) {

Bundle bundle = intent.getExtras();

SmsMessage[] msgs = null;

String message = "";

if(bundle != null) {

Object[] pdus = (Object[])bundle.get("pdus");

msgs = new SmsMessage[pdus.length];

for (int i=0 ; i<msgs.length ; i++) {

msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

message += "\nSMS getOriginatingAddress : " + msgs[i].getOriginatingAddress();

message += "\nSMS getDisplayOriginatingAddress : " + msgs[i].getDisplayOriginatingAddress();

message += "\nSMS getUserData : " + msgs[i].getUserData();

message += "\nSMS getProtocolIdentifier : " + msgs[i].getProtocolIdentifier();

message += "\nSMS getPseudoSubject : " + msgs[i].getPseudoSubject();

message += "\nSMS getServiceCenterAddress : " + msgs[i].getServiceCenterAddress();

message += "\n\n";

message += "\nSMS Body : " + msgs[i].getMessageBody().toString();

message += "\n";

}

}

// Toast.makeText(context, message, Toast.LENGTH_LONG).show();

Intent smsIntent = new Intent(context, SmsReceiveActivity.class);

smsIntent.putExtra("SMS_RECEIVE", message);

smsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(smsIntent);

}

}


가장 상위 클래스에서 BroadcastReceiver를 상속받았으니, 현재 SmsReceiver 는 매니페스트에서 receiver로 등록해줘야 하겠지.



========================================================================================================================================================




<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="mfamstory.test.sms"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk android:minSdkVersion="8" />


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

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

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


<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name="SmsSendActivity"

android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<receiver android:name="SmsReceiver">

<intent-filter>

<action android:name="android.provider.Telephony.SMS_RECEIVED" />

</intent-filter>

</receiver>


<activity android:name="SmsReceiveActivity" />


</application>

</manifest>


======================================================================================================================================


그럼 이제 문자가 오면


sms2.png

반응형

댓글