Read inbox messages of a particular number and display them in an activity

I am trying to read messages from an inbox and display them in an activity. My activity contains a button and listview. When I click on the button, all messages from the inbox are displayed. But my requirement is that I need to view messages from a particular number. My application is not running when I get messages from that number when I click on the click button only specific messages (associated with a particular number) must be updated.
Here’s the relevant code.

myActivity.java:

  • How are existing VPN applications creating new profiles in Android 2.0 - 2.3?
  • android - How can I make a button flash?
  • android library project and Activities
  • Android onPreviewFrame is not called
  • Power-Off or Restart an android device via Code/Program?
  • For Android Map api v2 Description references non existing library google-play-services_lib\bin\google-play-services_lib.jar
  • public class SecureMessagesActivity extends Activity implements OnClickListener, OnItemClickListener {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setTheme( android.R.style.Theme_Light );
            setContentView(R.layout.main);
            this.findViewById( R.id.UpdateList ).setOnClickListener( this );
        }
    
        ArrayList<String> smsList = new ArrayList<String>();
    
        public void onItemClick( AdapterView<?> parent, View view, int pos, long id ) {
            try {
                String[] splitted = smsList.get( pos ).split("\n"); 
                String sender = splitted[0];
                String encryptedData = "";
    
                for ( int i = 1; i < splitted.length; ++i ) {
                    encryptedData += splitted[i];
                }
                String data = sender + "\n" + StringCryptor.decrypt( new String(SmsReceiver.PASSWORD), encryptedData );
                Toast.makeText( this, data, Toast.LENGTH_SHORT ).show();
            } 
            catch (Exception e) {
                    e.printStackTrace();
            }
        }
    
        public void onClick( View v ) {
            ContentResolver contentResolver = getContentResolver();
            Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, null);
    
            int indexBody = cursor.getColumnIndex( SmsReceiver.BODY );
            int indexAddr = cursor.getColumnIndex( SmsReceiver.ADDRESS );
    
            if ( indexBody < 0 || !cursor.moveToFirst() ) return;
    
            smsList.clear();
    
            do {
                String str = "Sender: " + cursor.getString( indexAddr ) + "\n" + cursor.getString( indexBody );
                smsList.add( str );
            }
            while( cursor.moveToNext() );
    
            ListView smsListView = (ListView) findViewById( R.id.SMSList );
            smsListView.setAdapter( new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, smsList) );
            smsListView.setOnItemClickListener( this );
        }
    } 
    

    SmsReceiver.java:

    public class SmsReceiver extends BroadcastReceiver {
        public static final String SMS_EXTRA_NAME = "pdus";
        public static final String SMS_URI = "content://sms";
    
        public static final String ADDRESS = "address";
        public static final String PERSON = "person";
        public static final String DATE = "date";
        public static final String READ = "read";
        public static final String STATUS = "status";
        public static final String TYPE = "type";
        public static final String BODY = "body";
        public static final String SEEN = "seen";
    
        public static final int MESSAGE_TYPE_INBOX = 1;
        public static final int MESSAGE_TYPE_SENT = 2;
    
        public static final int MESSAGE_IS_NOT_READ = 0;
        public static final int MESSAGE_IS_READ = 1;
    
        public static final int MESSAGE_IS_NOT_SEEN = 0;
        public static final int MESSAGE_IS_SEEN = 1;
    
    
        public static final byte[] PASSWORD = new byte[]{ 0x20, 0x32, 0x34, 0x47, (byte) 0x84, 0x33, 0x58 };
    
        public void onReceive( Context context, Intent intent ) {
    
            Bundle extras = intent.getExtras();
            String messages = "";
    
            if ( extras != null ) {
                Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );
                ContentResolver contentResolver = context.getContentResolver();
    
                for ( int i = 0; i < smsExtra.length; ++i ) {
                    SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);
    
                    String body = sms.getMessageBody().toString();
                    String address = sms.getOriginatingAddress();
    
                    messages += "SMS from " + address + " :\n";                    
                    messages += body + "\n";
                    putSmsToDatabase( contentResolver, sms );
                }
    
                // Display SMS message
                Toast.makeText( context, messages, Toast.LENGTH_SHORT ).show();
            }
    
            // WARNING!!! 
            // If you uncomment next line then received SMS will not be put to incoming.
            // Be careful!
            // this.abortBroadcast(); 
        }
    
        private void putSmsToDatabase( ContentResolver contentResolver, SmsMessage sms ) {
            ContentValues values = new ContentValues();
            values.put( ADDRESS, sms.getOriginatingAddress() );
            values.put( DATE, sms.getTimestampMillis() );
            values.put( READ, MESSAGE_IS_NOT_READ );
            values.put( STATUS, sms.getStatus() );
            values.put( TYPE, MESSAGE_TYPE_INBOX );
            values.put( SEEN, MESSAGE_IS_NOT_SEEN );
            try {
                String encryptedPassword = StringCryptor.encrypt( new String(PASSWORD), sms.getMessageBody().toString() ); 
                values.put( BODY, encryptedPassword );
            }
            catch ( Exception e ) { 
                e.printStackTrace(); 
            }
    
            // Push row into the SMS table
            contentResolver.insert( Uri.parse( SMS_URI ), values );
        }
    }
    

  • AppWidgetManager getAppWidgetIds returning old Widget ids
  • android tests often stall at 'instantiating tests'
  • Detect if connection is wifi, 3G or EDGE in android?
  • Passing data of a non-primitive type between activities in android
  • Get Updated Contacts in Android for Contact Sync
  • What are the purpose of intent categories?
  • 4 Solutions collect form web for “Read inbox messages of a particular number and display them in an activity”

    try this code you get sms for pertucular number:

    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    
    public class MainActivity extends Activity {
    
        ArrayList<String> sms_id = new ArrayList<String>();
        ArrayList<String> sms_num = new ArrayList<String>();
        ArrayList<String> sms_Name = new ArrayList<String>();
        ArrayList<String> sms_dt = new ArrayList<String>();
        ArrayList<String> sms_body = new ArrayList<String>();
    
        // private ImageView imageView;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Uri myMessage = Uri.parse("content://sms/");
            ContentResolver cr = this.getContentResolver();
            Cursor c = cr.query(myMessage, new String[] { "_id", "address", "date",
                    "body", "read" }, "address = '+9180009'", null, null);
            startManagingCursor(c);
            getSmsLogs(c, MainActivity.this);
    
        }
    
        public void getSmsLogs(Cursor c, Context con) {
    
            if (sms_num.size() > 0) {
                sms_id.clear();
                sms_num.clear();
                sms_Name.clear();
                sms_body.clear();
                sms_dt.clear();
            }
            try {
                if (c.moveToFirst()) {
                    do {
                        if (c.getString(c.getColumnIndexOrThrow("address")) == null) {
                            c.moveToNext();
                            continue;
                        }
                        String Number = c.getString(
                                c.getColumnIndexOrThrow("address")).toString();
                        String _id = c.getString(c.getColumnIndexOrThrow("_id"))
                                .toString();
                        String dat = c.getString(c.getColumnIndexOrThrow("date"))
                                .toString();
                        String Body = c.getString(c.getColumnIndexOrThrow("body"))
                                .toString();
                        Log.e("Body-->", "" + Body);
                        sms_id.add(_id);
                        sms_num.add(Number);
                        sms_body.add(Body);
                    } while (c.moveToNext());
                }
                c.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    check log for sms body: you have to use below permission

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

    add an if statement in your loop to match the selected number

    String selectedNumber;
    // copy the selected number to selectedNumber
    do {
            if(cursor.getString( indexAddr ).equals(selectedNumber))
            {
               String str = "Sender: " + cursor.getString( indexAddr ) + "\n" +     cursor.getString( indexBody );
               smsList.add( str );
            }
        }
    while( cursor.moveToNext() );
    

    Here only the messages from number matching the selected number will be added to smsList. It is an old question but i hope it will be helpful for someone

    If you want to read messages only from particular number you need to somehow filter your data.

    This example filter cursor and sort it.

          selection = "_id = " + 15;
          Cursor curSms = context.getContentResolver().query(smsUri, null, selection,   null, "date ASC");
    
     public class IncomingSms extends BroadcastReceiver 
      {
       @Override
        public void onReceive(Context context, Intent intent) 
        {
         final Bundle bundle = intent.getExtras();
       try {
        if (bundle != null) 
      {
      final Object[] pdusObj = (Object[]) bundle.get("pdus");
      for (int i = 0; i < pdusObj .length; i++) 
         {
         SmsMessage currentMessage =
                        SmsMessage.createFromPdu((byte[])pdusObj[i]);                                                                                                                                  
         String phoneNumber = currentMessage.getDisplayOriginatingAddress();
         String senderNum = phoneNumber ;
         String message = currentMessage .getDisplayMessageBody();
          try
          {  
          if (senderNum .equals("TA-DOCOMO")) 
             {
             Otp Sms = new Otp();
             Sms.recivedSms(message );
             }
         }
         catch(Exception e){}
    
         }
        }
    
    } catch (Exception e) 
         {
    
       }
          }
    
    }
    

    For more reference click here http://androiddhina.blogspot.in/2015/06/reading-incoming-message-automatically-to-verify-OTP.html

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.