阅读Android发送框时获取null异常

时间:2014-06-25 00:40:06

标签: android inbox

我有一个assynctask,它将读取对话框中的所有内容,并且效果很好

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"; 
    }

但如果我的应用程序写入 content:// sms / sent ,则上述代码会给出null异常,但是库存消息应用程序可以很好地读取它。

这是我更新发送的项目的方法

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();
}

具体来说,我无法在已发送的项目中获取消息的地址..下面返回null异常..我认为与我的URI有关。

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

如果我以这种方式编写/更新我发送的邮箱,有人可以提示我为什么无法阅读?

1 个答案:

答案 0 :(得分:0)

我已经通过管理来解决问题。这是另一种使用消息ID写入已发送框的方法,其中有另一种方法使用该地址写入发送框。

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; 
    }

更改此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());
    }