0

I am making an app which records the messages from a particular sender.For e.g I want to get all SMS from the bank HDFC in a Listview.The sender's address in my inbox is named as "AM-HDFC".I have tried the below code but the app crashes saying that URI is not found.What will be the possible solution?

public class MsgReader extends AppCompatActivity {
    Cursor c;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msg_reader);
        List<Sms> smslist=getAllSms("inbox");
        RecyclerView rView = (RecyclerView) findViewById(R.id.list);
        rView.setLayoutManager(new LinearLayoutManager(this));
        rView.setHasFixedSize(true);
        MsgAdapter rcAdapter = new MsgAdapter(smslist);
        rView.setAdapter(rcAdapter);

    }
    public List<Sms> getAllSms(String folderName) {

        List<Sms> lstSms = new ArrayList<Sms>();
        Sms objSms = new Sms();
        Uri message = Uri.parse("content://sms/");
        ContentResolver cr = this.getContentResolver();

        c= cr.query(Uri.parse("content://mms-sms/AM-HDFC"), null, null, null, null);
        this.startManagingCursor(c);
        int totalSMS = c.getCount();

        if (c.moveToFirst()) {
            for (int i = 0; i < totalSMS; i++) {

                objSms = new Sms();
                objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
                objSms.setAddress(c.getString(c.getColumnIndexOrThrow("address")));
                objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
                objSms.setReadState(c.getString(c.getColumnIndex("read")));
                objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));

                lstSms.add(objSms);
                c.moveToNext();
            }
        }
         else {
         throw new RuntimeException("You have no SMS in " + folderName);
         }
        c.close();

        return lstSms;
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (c != null) {
            c.close();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (c != null) {
            c.close();
        }
    }
}
Omar Aflak
  • 2,918
  • 21
  • 39

1 Answers1

0

Try this :

public void getSmsInbox(Context context, String address) {
    String selection = Telephony.Sms.ADDRESS+"='"+address+"'";

    ContentResolver cr = context.getContentResolver();
    Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null, selection, null, null);
    if (c != null) {
        if (c.moveToFirst()) {
            for (int j = 0; j < c.getCount() ; j++) {
                String smsDate = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.DATE));
                Date dateFormat = new Date(Long.valueOf(smsDate));
                String body = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.BODY));
                Log.d(TAG, address+", "+dateFormat.toString()+" : "+body);
                c.moveToNext();
            }
        }
        c.close();
    } else {
        Toast.makeText(this, "No message to show!", Toast.LENGTH_SHORT).show();
    }
}

Use it like this :

getSmsInbox(MainActivity.this, "AM-HDFC");

And don't forget to ask for the permission :

<uses-permission android:name="android.permission.READ_SMS" />
Omar Aflak
  • 2,918
  • 21
  • 39
  • Thanks for reply.But unfortunately its not working.Actually when I open the Messaging App the "AM-HDFC" folder is stored into a seprate folder called "Notifiactions". – Shubham Tunwal Sep 24 '17 at 11:08
  • Hmm.. I've never seen subfolders in messaging apps.. I removed the _if_ statement in my answer, try again. If it doesn't work could you post a screen of your messaging app ? – Omar Aflak Sep 24 '17 at 11:16