首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取Android发送框时获得空异常

读取Android发送框时获得空异常
EN

Stack Overflow用户
提问于 2014-06-25 00:40:05
回答 1查看 273关注 0票数 0

我有一个assynctask,它将读取对话框中的所有内容,并且运行良好。

代码语言:javascript
复制
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,上面的代码会给出空异常,但是股票消息应用程序可以很好地阅读它。

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

代码语言:javascript
复制
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();
}

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

代码语言:javascript
复制
if (Cursor.moveToFirst()) 
                number = Cursor.getString(Cursor.getColumnIndexOrThrow("address")).toString();

有人能给我提示一下,如果我用这种方式写/更新我的发送框,它为什么不能读?

EN

回答 1

Stack Overflow用户

发布于 2014-06-25 05:58:28

我设法解决了这个问题。这是另一种使用消息ID写入发送框的方法,其中有另一种使用地址写入发送框的方法。

代码语言:javascript
复制
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; 
    }

将此更改为:

代码语言:javascript
复制
    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);

}

至:

代码语言:javascript
复制
    void sentBox(){
    ContentValues values = new ContentValues();
    values.put("address", getIntent().getExtras().getString("number"));
    values.put("body", mMessageEditText.getText().toString());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24398498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档