Chapter 8-1: Dealing with SMS In Android, you can use SmsManager API or device’s Built-in SMS application to send a SMS message. In this tutorial, we show you two basic examples to send SMS message: 1. Built-in SMS application Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.putExtra(\"address\", \"default content\"); sendIntent.putExtra(\"sms_body\", \"default content\"); sendIntent.setType(\"vnd.android-dir/mms-sms\"); startActivity(sendIntent); 2. SmsManager API SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(\"phoneNo\", null, \"sms message\", null, null); Of course, both need SEND_SMS permission. <uses-permission android:name=\"android.permission.SEND_SMS\" /> Note: The Built-in SMS application solution is the easiest way, because you let device handle everything for you. Application Layout
Built-in SMS application Example This example is using the device’s build-in SMS application to send out the SMS message. Adding Permission: File: AndroidManifest.xml <uses-permission android:name=\"android.permission.SEND_SMS\" /> Defining Layout: File: res/layout/main.xml <?xml version=\"1.0\" encoding=\"utf-8\"?> <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\" android:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\" > <TextView android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Enter the phone number of recipient\" /> <EditText android:id=\"@+id/txtPhoneNo\" android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" /> <TextView android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Message\" /> <EditText android:id=\"@+id/txtMessage\" android:layout_width=\"fill_parent\" android:layout_height=\"150px\" android:gravity=\"top\" /> <Button android:id=\"@+id/btnSendSMS\" android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Send SMS\" /> </LinearLayout>
Source Code File: MainActivity.java – Activity class to use build-in SMS intent to send out the SMS message. package com.workshop.sms1; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { Button btnSendSMS; EditText txtPhoneNo; EditText txtMessage; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnSendSMS = (Button) findViewById(R.id.btnSendSMS); txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); txtMessage = (EditText) findViewById(R.id.txtMessage); 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) { Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.putExtra(\"address\", phoneNo); sendIntent.putExtra(\"sms_body\", message); sendIntent.setType(\"vnd.android-dir/mms-sms\"); startActivity(sendIntent); } else Toast.makeText(getBaseContext(), \"Please enter both phone number and message.\", Toast.LENGTH_SHORT).show(); } }); } }
SMS Manager API Example In this example, we will use the SMS Manager API to send the SMS programmatically from our application. In addition, we will monitor the status of the SMS message (Sent and Delivered status) by using two PendingIntent objects together with two BroadcastReceiver objects. Adding Permission: File: AndroidManifest.xml <uses-permission android:name=\"android.permission.SEND_SMS\" /> Defining Layout: File: res/layout/main.xml <?xml version=\"1.0\" encoding=\"utf-8\"?> <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" android:orientation=\"vertical\" android:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\" > <TextView android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Enter the phone number of recipient\" /> <EditText android:id=\"@+id/txtPhoneNo\" android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" /> <TextView android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Message\" /> <EditText android:id=\"@+id/txtMessage\" android:layout_width=\"fill_parent\" android:layout_height=\"150px\" android:gravity=\"top\" /> <Button android:id=\"@+id/btnSendSMS\" android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:text=\"Send SMS\" />
</LinearLayout> Sending SMS To send an SMS message, you use the SmsManager class. Unlike other classes, you do not directly instantiate this class; instead you will call the getDefault() static method to obtain an SmsManager object. SmsManager sms = SmsManager.getDefault(); sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); Monitoring the status of SMS The sendTextMessage() method sends the SMS message with a PendingIntent. The PendingIntent object is used to identify a target to invoke at a later time. If you need to monitor the status of the SMS message sending process (Sent and Delivered status), you can actually use two PendingIntent objects together with two BroadcastReceiver objects. 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); The full monitoring of the SMS status are showing below with the complete code Source Code File: MainActivity.java – Activity class to use SMS Manager API to send out and monitor the SMS message. package com.workshop.sms2; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; public class MainActivity extends Activity { Button btnSendSMS;
EditText txtPhoneNo; EditText txtMessage; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnSendSMS = (Button) findViewById(R.id.btnSendSMS); txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo); txtMessage = (EditText) findViewById(R.id.txtMessage); 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(); } }); } //---sends an SMS message to another device--- 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); }}
Receiving SMS Messages (Continued) Besides programmatically sending SMS messages, we can also intercept incoming SMS messages using a BroadcastReceiver object. To see how to receive SMS messages from within your Android application: In the AndroidManifest.xml file: 1. Add the <receiver> element so that incoming SMS messages can be intercepted by the SmsReceiver class <receiver android:name=\".SmsReceiver\"> <intent-filter> <action android:name=\"android.provider.Telephony.SMS_RECEIVED\" /> </intent-filter> </receiver> 2. Add Receive SMS permission <uses-permission android:name=\"android.permission.RECEIVE_SMS\" /> The SmsReceiver class extends the BroadcastReceiver class and overrides the onReceive() method. When SMS messages are received, the onCreate() method will be invoked. The SMS message is contained and attached to the Intent object (intent - the second parameter in the onReceive() method) via a Bundle object. The messages are stored in an Object array in the PDU (Protocol Description Unit) format. To extract each message, you use the static createFromPdu() method from the SmsMessage class. The SMS message is then displayed using the Toast class: Source Code File: SmsReceiver.java package com.workshop.sms2; 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 { @Override public void onReceive(Context context, Intent intent) {
//---get the SMS message passed in--- Bundle bundle = intent.getExtras(); SmsMessage[] msgs = null; String str = \"\"; if (bundle != null) { //---retrieve the SMS messages received--- 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]); str += \"SMS from \" + msgs[i].getOriginatingAddress(); str += \" :\"; str += msgs[i].getMessageBody().toString(); str += \"\n\"; } //---display the new SMS message--- Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } } }
Search
Read the Text Version
- 1 - 9
Pages: