Blog : Listening incoming sms message in Android

Listening incoming sms message in Android


When a new sms message is received by the device, a Broadcast Receiver is registered. For this

IntentFilter filter = new IntentFilter(SMS_RECEIVED);
registerReceiver(receiver_SMS, filter);

should be included . Also sms are sent in PDU’s(Protocol Description Units) format, which act as an encapsulation.
Inorder to extract from PDU to byte array

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

method is used.
When sms comes, the BroadCast listener is activated and sms sender number is showed in a ListView

package com.coderzheaven.pack;

import java.util.ArrayList;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class smsReceiver extends Activity
{
  /** Called when the activity is first created. */
    public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    ListView list;
    ArrayList messageList;
    ArrayAdapter< String> adapter;
  public void onCreate(Bundle savedInstanceState)
  {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  list = (ListView) findViewById(R.id.listView1);

  messageList  = new ArrayList();
  //messageList.add("check");
  adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, messageList);
  list.setAdapter(adapter);

  IntentFilter filter = new IntentFilter(SMS_RECEIVED);
  registerReceiver(receiver_SMS, filter);
  }
  BroadcastReceiver receiver_SMS = new BroadcastReceiver()
  {
     public void onReceive(Context context, Intent intent)
     {
        if (intent.getAction().equals(SMS_RECEIVED))
        {
        Bundle bundle = intent.getExtras();
        if (bundle != null)
        {
        Object[] pdus = (Object[]) bundle.get("pdus");
        SmsMessage[] messages = new SmsMessage[pdus.length];

        for (int i = 0; i < pdus.length; i++)
        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

        for (SmsMessage message : messages)
        {
            Toast.makeText(smsReceiver.this, "----"+message.getDisplayMessageBody(), Toast.LENGTH_LONG).show();
            receivedMessage(message.getDisplayOriginatingAddress());
        }
        }
        }
     }
   };
   private void receivedMessage(String message)
   {
     messageList.add(message);
     adapter.notifyDataSetChanged();
   }
}
The xml hold a ListView


  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/hello"
  />
   android:id="@+id/listView1"
   android:layout_width="fill_parent"/>

Also important part is that, for an application to listen an SMS Intent Broadcast should be added