Search code examples
androidsmsandroid-sms

Cannot get sent sms (text messages) from device


I would like to get all the sent sms (text messages) from a device. I can get all of them from the inbox with:

public List<SMS> getAllInboxSMS(Context ctx) {

    List<SMS> inboxSMSList = new ArrayList<>();

    try {

        Uri uriSms = Uri.parse("content://sms/inbox");
        Cursor c = ctx.getContentResolver().query(uriSms, new String[]{"_id", "thread_id", "address", "person", "date", "body"}, "read=0", null, null);

        if (c != null && c.moveToFirst()) {
            do {
                inboxSMSList.add(new SMS(c));
            } while (c.moveToNext());
        }

    } catch (Exception e) {
        Log.e("getAllInboxSMS", e.toString());
    }

    Log.i("inbox", "size: " + inboxSMSList.size());
    Log.i("inbox", inboxSMSList.toString());

    return inboxSMSList;
}

However if I modify

Uri.parse("content://sms/inbox");

to

Uri.parse("content://sms/sent");

The returned list size is 0.

I tried to set the app as default sms app but it doesn't work in that way either.

I work on Lollipop (Android 5).

Please help if you can.


Solution

  • To read all messages for inbox or sent programmatically in Android use following function.

    public List<Sms> getAllSms(String folderName) {
    List<Sms> lstSms = new ArrayList<Sms>();
    Sms objSms = new Sms();
    Uri message = Uri.parse("content://sms/"+folderName);
    ContentResolver cr = mActivity.getContentResolver();
    
    Cursor c = cr.query(message, null, null, null, null);
    mActivity.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;}
    

    Call above function to get all messages from inbox or send folder.

    getAllSms("inbox"); // Get all sms from inbox
    
    
    getAllSms("sent"); // Get all sms from sent
    

    To get all sms from inbox or sent folder use following function

    public List<Sms> getAllSms() {
    List<Sms> lstSms = new ArrayList<Sms>();
    Sms objSms = new Sms();
    Uri message = Uri.parse("content://sms/");
    ContentResolver cr = mActivity.getContentResolver();
    
    Cursor c = cr.query(message, null, null, null, null);
    mActivity.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")));
            if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                objSms.setFolderName("inbox");
            } else {
                objSms.setFolderName("sent");
            }
    
            lstSms.add(objSms);
            c.moveToNext();
        }
    }
    // else {
    // throw new RuntimeException("You have no SMS");
    // }
    c.close();
    
    return lstSms;}
    

    Sms class is below:

    public class Sms{
    private String _id;
    private String _address;
    private String _msg;
    private String _readState; //"0" for have not read sms and "1" for have read sms
    private String _time;
    private String _folderName;
    
    
    public String getId(){
    return _id;
    }
    public String getAddress(){
    return _address;
    }
    public String getMsg(){
    return _msg;
    }
    public String getReadState(){
    return _readState;
    }
    public String getTime(){
    return _time;
    }
    public String getFolderName(){
    return _folderName;
    }
    public void setId(String id){
    _id = id;
    }
    public void setAddress(String address){
    _address = address;
    }
    
    
    public void setMsg(String msg){
    _msg = msg;
    }
    
    public void setReadState(String readState){
    _readState = readState;
    }
    
    public void setTime(String time){
    _time = time;
    }
    public void setFolderName(String folderName){
    _folderName = folderName;
    }
    
    }
    

    Don’t forget to define following permission in your AndroidManifest.xml

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

    for marshmallow device support you to check runtime permission

    for reference runtime permission