Android 彩信发送者地址问题

Android 彩信发送者地址问题,android,mms,Android,Mms,我想知道寄件人的地址,但遇到了一个小问题。如果发送消息的人是任何对话中第一个发送消息的人,content://mms/inbox返回的行数为零??但是当有人发送任何其他彩信时,它会返回\u id很好,我不明白为什么第一条不能正常工作 private String checkMmsMessages(Context context){ String address = "address"; Cursor curPdu = context.getContentResolver ().

我想知道寄件人的地址,但遇到了一个小问题。如果发送消息的人是任何对话中第一个发送消息的人,
content://mms/inbox
返回的行数为零??但是当有人发送任何其他彩信时,它会返回
\u id
很好,我不明白为什么第一条不能正常工作

private String checkMmsMessages(Context context){
    String address = "address";

    Cursor curPdu = context.getContentResolver ().query(Uri.parse("content://mms/inbox"), null, null, null, null);
    if(curPdu.moveToNext()){ //first MMS message curPdu.moveToNext() is false
    String id = curPdu.getString (curPdu.getColumnIndex ("_id"));

    Log.v("MMS", "ID1: " + id.toString());

    Uri uriAddr = Uri.parse ("content://mms/" + id + "/addr");
    Cursor curAddr = context.getContentResolver().query(uriAddr,null,"type=137",null,null);
    if(curAddr.moveToNext()){
             address = curAddr.getString (curAddr.getColumnIndex ("address"));
             Log.v("MMS", "Address1: " + address.toString());
             if(address.contentEquals("insert-address-token")){
                 Cursor curAddr2 = context.getContentResolver().query(uriAddr,null,"type=151", null,null);
                 if(curAddr2.moveToNext()){
                     address = curAddr2.getString(curAddr2.getColumnIndex("address"));
                 }
             }
        }
    }
    Log.v("MMS", address.toString());
    return address;
}

还有一件没有意义的事情是,当我将手机插入计算机并使用调试器逐步完成该部分时,该问题不会发生,并且每次都会得到地址。。。。只有当手机未连接时才会发生这种情况,我只是不明白?

我认为问题在于您正在将
selectionArgs
的值而不是null传递给
query()
方法。实际上,我不是在代码中调用mCursor的
moveToNext()
方法,而是在
SimpleCursorAdapter
的getView()方法中实现此逻辑

Uri uri = Uri.parse("content://mms-sms/conversations/" + mThreadId);
String[] projection = new String[] { "body", "person", "sub",
            "subject", "retr_st", "type", "date", "ct_cls", "sub_cs",
            "_id", "read", "ct_l", "st", "msg_box", "reply_path_present",
            "m_cls", "read_status", "ct_t", "status", "retr_txt_cs",
            "d_rpt", "error_code", "m_id", "date_sent", "m_type", "v",
            "exp", "pri", "service_center", "address", "rr", "rpt_a",
            "resp_txt", "locked", "resp_st", "m_size" };
String sortOrder = "normalized_date";

Cursor mCursor = getActivity().getContentResolver().query(uri,projection, null, null, sortOrder);

String messageAddress;
int type;
while (mCursor.moveToNext()) {
    String messageId = mCursor.getString(mCursor.getColumnIndex("_id"));

    Uri.Builder builder = Uri.parse("content://mms").buildUpon();
    builder.appendPath(messageId).appendPath("addr");
    Cursor c = mContext.getContentResolver().query(builder.build(), new String[] {
        "*"
    }, null, null, null);
    while (c.moveToNext()) {
        messageAddress = c.getString(c.getColumnIndex("address"));

        if (!messageAddress.equals("insert-address-token")) {
            type = c.getInt(c.getColumnIndex("type"));
            c.moveToLast();
        }
    }
    c.close();
}

问题是,我在将消息放入数据库之前检查了数据库,因此我必须在检查上设置一个延迟

type=137
用于仅获取来自数据库表的传入消息,因为该表中有两种不同的类型,
151
这是您发送的消息,而
137
是您收到的消息。我可以确认这不是所有情况下的解决方案。
try this...


    private String getAddressNumber(String id) {
            String selectionAdd = new String("msg_id=" + id);
            String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
            Uri uriAddress = Uri.parse(uriStr);
            Cursor cursor = getContentResolver().query(uriAddress, null, selectionAdd, null, null);

            String phoneNum = null;
            if (cursor.moveToFirst()) {
                do {
                    String number = cursor.getString(cursor.getColumnIndex("address"));
                    if (number != null) {
                        boolean isNumberFormat = true;
                        try {
                            Long.parseLong(number.replace("-", ""));
                            phoneNum = number;
                        } catch (NumberFormatException e) { // ex) "insert-address-token"
    //                        if (phoneNum == null) {
    //                            phoneNum = number;
    //                        }
                            isNumberFormat = false;
                        }
                        if (isNumberFormat)
                            break;
                    }
                } while (cursor.moveToNext());
            }
            if (cursor != null) {
                cursor.close();
            }
            return phoneNum;
        }