0

I have an assynctask that will read all the content in the conversation box and it works well

protected String doInBackground(String... params) {
        Uri inboxURI = Uri.parse("content://sms/conversations");
        ContentResolver cr = getContentResolver();
        Cursor c = cr.query(inboxURI, null, null, null, null);
        c.moveToLast();

        al = new ArrayList<MessageInfo>();
        try{
        for (int i = c.getCount(); i > 0; i--) {

            MessageInfo mMessageInfo = new MessageInfo();
            mMessageInfo.MessageText = c.getString(c.getColumnIndexOrThrow("snippet"));
            mMessageInfo.ThreadId = c.getInt(c.getColumnIndex("thread_id"));

            Uri uri = Uri.parse("content://sms/inbox");
            String where = "thread_id=" + mMessageInfo.ThreadId;
            Cursor Cursor = getContentResolver().query(uri, null, where,null, null);
            startManagingCursor(Cursor);

            //Cursor.moveToFirst();
            String number = "";
            String name = "";


            if (Cursor.moveToFirst()) {

                number = Cursor.getString(Cursor.getColumnIndexOrThrow("address")).toString();
                name = GetNameAndNumber(Cursor, number, MessageBox.this);
                Log.i("checkPoint","checkPoint-1 "+name);
            } 
                else {
                uri = Uri.parse("content://sms/sent");
                where = "thread_id=" + mMessageInfo.ThreadId;
                Cursor = GetCursor(uri, where, MessageBox.this);

                if (Cursor.moveToFirst()) {
                    number = Cursor.getString(Cursor.getColumnIndexOrThrow("address")).toString();
                    name = GetNameAndNumber(Cursor, number, MessageBox.this);

                    Log.i("checkPoint","checkPoint-2 "+name);
                }Cursor.close();
            } 

            if (name.length() > 0) {
                mMessageInfo.Name = name;
            } else {
                mMessageInfo.Name = number;
            }
            mMessageInfo.Number = number;

            Log.i("name",name);
            Log.i("number",number);
            Log.i("mMessageInfo.ThreadId ",""+mMessageInfo.ThreadId );

            al.add(mMessageInfo);
            c.moveToPrevious();
        }c.close(); 
        }catch(Exception x){x.printStackTrace();}


        return "Executed"; 
    }

But if my app writes to content://sms/sent the above code gives null exception but the stock messaging app can read it well.

This is the method how I update my sent items

void sentBox(){
    ContentValues values = new ContentValues();

    values.put("address", number);
    values.put("body", msgBox.getText().toString());

    getContentResolver().insert(Uri.parse("content://sms/sent"), values);
    finish();
}

To be specific I cannot get the address of the message in the sent items.. below returns null exception.. I think there is something to do with my URI.

if (Cursor.moveToFirst()) 
                number = Cursor.getString(Cursor.getColumnIndexOrThrow("address")).toString();

Can someone give me hint why it can't read if I write/update my sent box that way?

mboy
  • 744
  • 7
  • 17

1 Answers1

0

I've Manage to fix the problem. It was another method which is writing to sent box using the message ID where there is another method writing to sent box using the address..

protected String doInBackground(String... params) {

        al = new ArrayList<MessageInfo>();
        String number = "";
        String name = "";

        Uri conversationURI = Uri.parse("content://sms/conversations");
        ContentResolver cr = getContentResolver();
        Cursor c = cr.query(conversationURI, null, null, null, null);
        c.moveToLast();

        for (int i = c.getCount(); i > 0; i--) {

            MessageInfo mMessageInfo = new MessageInfo();
            mMessageInfo.MessageText = c.getString(c.getColumnIndexOrThrow("snippet"));
            mMessageInfo.ThreadId = c.getInt(c.getColumnIndex("thread_id"));

        try{    
            Uri message = Uri.parse("content://sms/inbox");
            ContentResolver cr_ = getContentResolver();
            String where_ = "thread_id=" + mMessageInfo.ThreadId;

            Cursor c_ = cr_.query(message, null, where_, null, null);
            startManagingCursor(c_);

            if (c_.moveToFirst() && c_ != null) {
                number = c_.getString(c_.getColumnIndexOrThrow("address"));
                name = GetNameAndNumber(c_, number, MessageBox.this);

            }else{
                Uri _message_ = Uri.parse("content://sms/sent");
                ContentResolver _cr_ = getContentResolver();
                String _where_ = "thread_id=" + mMessageInfo.ThreadId;
                Cursor _c_ = _cr_.query(_message_, null, _where_, null, null);

                if (_c_.moveToFirst() && _c_ != null) {
                    number = _c_.getString(_c_.getColumnIndexOrThrow("address"));
                    name = GetNameAndNumber(_c_, reformatNumber(number), MessageBox.this);
                }
            }

            }catch(Exception x){x.printStackTrace();}

            if (name.length() > 0) {
                mMessageInfo.Name = name;
            } else {
                mMessageInfo.Name = number;
            }
            mMessageInfo.Number = number;

            al.add(mMessageInfo);
            c.moveToPrevious();
        }c.close(); 
        return null; 
    }

Changed this FROM:

    void sentBox(){
    ContentValues values = new ContentValues();
    values.put("thread_id", getIntent().getExtras().getInt("ID"));
    values.put("body", mMessageEditText.getText().toString());
    getContentResolver().insert(Uri.parse("content://sms/sent"), values);

}

TO:

    void sentBox(){
    ContentValues values = new ContentValues();
    values.put("address", getIntent().getExtras().getString("number"));
    values.put("body", mMessageEditText.getText().toString());
    }
mboy
  • 744
  • 7
  • 17