android讀取簡訊多媒體訊息

來源:互聯網
上載者:User

由於項目需要讀取手機內的簡訊和多媒體訊息資料,不知道如何來處理,本來這個項目是別人做的,後來讓我來修改,都是百度點代碼粘貼上去,一問為啥這樣處理,都是說網上找的代碼,我對我修改後的東西做了下整理,首先感謝http://kaifazhe001.com/article/actueal_-8060143.html這篇部落格,給了我很大的協助,裡面有些東西是看系統源碼來處理的。

會話列表的讀取通過查詢content://mms-sms/conversations?simple=true這個Url可以獲得到,由於裡面有多媒體訊息和簡訊,處理方式如下:

mThreadId = mCursor.getString(ID);    mSnippetCS = mCursor.getLong(SNIPPET_CS);    if(mSnippetCS ==0){    mSnippet = mCursor.getString(SNIPPET);    }    else{    try {    mSnippet = new String(    mCursor.getString(SNIPPET).getBytes("ISO8859_1"), "utf-8");    } catch (UnsupportedEncodingException e) {    // TODO Auto-generated catch block    e.printStackTrace();    }    }

其中mThreadId就是簡訊及多媒體訊息資料庫中所需要的threadid。

點擊某個會話列表進入和某個連絡人所有的聊天記錄時,系統的實現方式是通過查詢url:content://mms-sms/conversations/+會話Id(mThreadId),查詢的列項不可為空,我試著寫成NULL去查,每次都會出現null 指標異常,源碼內這個參數是:

final String[] PROJECTION = {"transport_type","_id","thread_id","address","body","date","date_sent","read","type","status","locked","error_code","sub","sub_cs","date","date_sent","read","m_type","msg_box","d_rpt","rr","err_type","locked","sim_id","sim_id","service_center","service_center"};

查詢完得到Cursor後,簡訊內容可以直接提取出來,這個簡訊和多媒體訊息的排列是按照日期已經排列好了,但多媒體訊息的內容系統源碼是通過一個pud包來處理的,這個源碼我複製到本地後會用到系統內的.class檔案中的方法,所以只能終止這樣處理,我想是既然這個多媒體訊息和簡訊已經排列好了,而且簡訊的內容已經可以擷取到了,那我直接從多媒體訊息資料庫中讀取多媒體訊息就可以了(content://mms),只要查詢出多媒體訊息資料庫中的id和當前需要的多媒體訊息的id一樣的多媒體訊息就可以了,但這個地方沒有辦法擷取到id(反正我是沒有找到,如果你知道的話,麻煩告訴我一下),所以又終止了。
所以我是先從簡訊資料庫中查詢出threadid和現在的threadid一樣的所有簡訊(content://sms),然後把date,body,是否為發送的簡訊儲存在一個對象中(我自己定義的類對象),然後把這個Object Storage Service在List<MessageBase> mMessageList中,然後從多媒體訊息資料庫中查詢出threadid和現在的threadid一樣的所有多媒體訊息(content://mms),然後把date, subject, 圖片,是否為發送的多媒體訊息儲存在一個對象中(我自己定義的類對象),然後儲存在mMessageList中,當然多媒體訊息和簡訊對象的類都是繼承自一個基類,然後對mMessageList依據date相進行排序,在這個排序的過程中由於多媒體訊息是以秒來記錄的,而簡訊是以毫秒來記錄的,所以在排序前需要進行1000的縮放,排好序後的mMessageList和手機簡訊中的列表一致了,然後進行顯示,這個顯示是採用一個ListView,重寫Adapter(如上一篇部落格--重寫ListView
Adapter)。
以下是MessageBase的定義:

public class MessageBase {    public long mDate;    public String mThreadId;    public String mId;    public boolean mIsSms;    public boolean mIsInbox;    }

以下是MessageSms的定義:

public class MessageSms extends MessageBase {    public int mType;    public String mBody;    }

以下是MessageMms的定義:

public class MessageSms extends MessageBase {    public int mType;    public String mBody;    }

簡訊中判斷某條簡訊是否為接收的資訊:

messageSms.mType = cursor.getInt(cursor.getColumnIndex("type"));    if(messageSms.mType == 1){    messageSms.mIsInbox = true;    }    else{    messageSms.mIsInbox = false;    }

多媒體訊息中判斷某條多媒體訊息是否為接受的資訊:

messageMms.mType = cursor.getInt(cursor.getColumnIndex("msg_box"));    if(messageSms.mType == 1){    messageMms.mIsInbox = true;    }    else{    messageMms.mIsInbox = false;    }

讀取多媒體訊息內容和多媒體訊息圖片的方法和http://kaifazhe001.com/article/actueal_-8060143.html部落格中寫的一樣,注意其中需要的"mid = ?"這個id是mms中的id,不是threadid。

各個Url表中所擁有的列名如下:

mms/part表:

02-20 17:19:55.224: I/xiao(19370): i = 0 name = _id02-20 17:19:55.224: I/xiao(19370): i = 1 name = mid02-20 17:19:55.224: I/xiao(19370): i = 2 name = seq02-20 17:19:55.224: I/xiao(19370): i = 3 name = ct02-20 17:19:55.224: I/xiao(19370): i = 4 name = name02-20 17:19:55.224: I/xiao(19370): i = 5 name = chset02-20 17:19:55.224: I/xiao(19370): i = 6 name = cd02-20 17:19:55.224: I/xiao(19370): i = 7 name = fn02-20 17:19:55.224: I/xiao(19370): i = 8 name = cid02-20 17:19:55.224: I/xiao(19370): i = 9 name = cl02-20 17:19:55.224: I/xiao(19370): i = 10 name = ctt_s02-20 17:19:55.224: I/xiao(19370): i = 11 name = ctt_t02-20 17:19:55.224: I/xiao(19370): i = 12 name = _data02-20 17:19:55.224: I/xiao(19370): i = 13 name = text

mms-sms/conversation/threadid表:

01-03 10:51:26.674: I/xiao(3343): i = transport_type01-03 10:51:26.674: I/xiao(3343): i = _id01-03 10:51:26.674: I/xiao(3343): i = thread_id01-03 10:51:26.674: I/xiao(3343): i = address01-03 10:51:26.674: I/xiao(3343): i = body01-03 10:51:26.675: I/xiao(3343): i = date01-03 10:51:26.675: I/xiao(3343): i = date_sent01-03 10:51:26.675: I/xiao(3343): i = read01-03 10:51:26.675: I/xiao(3343): i = type01-03 10:51:26.676: I/xiao(3343): i = status01-03 10:51:26.676: I/xiao(3343): i = locked01-03 10:51:26.677: I/xiao(3343): i = error_code01-03 10:51:26.677: I/xiao(3343): i = sub01-03 10:51:26.677: I/xiao(3343): i = sub_cs01-03 10:51:26.678: I/xiao(3343): i = date01-03 10:51:26.678: I/xiao(3343): i = date_sent01-03 10:51:26.678: I/xiao(3343): i = read01-03 10:51:26.678: I/xiao(3343): i = m_type01-03 10:51:26.678: I/xiao(3343): i = msg_box01-03 10:51:26.678: I/xiao(3343): i = d_rpt01-03 10:51:26.678: I/xiao(3343): i = rr01-03 10:51:26.680: I/xiao(3343): i = err_type01-03 10:51:26.680: I/xiao(3343): i = locked01-03 10:51:26.680: I/xiao(3343): i = sim_id01-03 10:51:26.680: I/xiao(3343): i = sim_id01-03 10:51:26.680: I/xiao(3343): i = service_center01-03 10:51:26.680: I/xiao(3343): i = service_centerMmsSms.TYPE_DISCRIMINATOR_COLUMN,        BaseColumns._ID,        Conversations.THREAD_ID,        // For SMS        Sms.ADDRESS,        Sms.BODY,        Sms.DATE,        Sms.DATE_SENT,        Sms.READ,        Sms.TYPE,        Sms.STATUS,        Sms.LOCKED,        Sms.ERROR_CODE,        // For MMS        Mms.SUBJECT,        Mms.SUBJECT_CHARSET,        Mms.DATE,        Mms.DATE_SENT,        Mms.READ,        Mms.MESSAGE_TYPE,        Mms.MESSAGE_BOX,        Mms.DELIVERY_REPORT,        Mms.READ_REPORT,        PendingMessages.ERROR_TYPE,        Mms.LOCKED,        //a0        Sms.SIM_ID,                Mms.SIM_ID,        Sms.SERVICE_CENTER,        Mms.SERVICE_CENTER

mms-sms/conversation表:

"_id", "date", "message_count","recipient_ids", "snippet", "snippet_cs", "read", "type","error", "has_attachment"

mms表:

02-20 17:00:28.810: I/xiao(17191): i = 0 name = _id02-20 17:00:28.810: I/xiao(17191): i = 1 name = thread_id02-20 17:00:28.810: I/xiao(17191): i = 2 name = date02-20 17:00:28.810: I/xiao(17191): i = 3 name = msg_box02-20 17:00:28.810: I/xiao(17191): i = 4 name = read02-20 17:00:28.810: I/xiao(17191): i = 5 name = m_id02-20 17:00:28.810: I/xiao(17191): i = 6 name = sub02-20 17:00:28.810: I/xiao(17191): i = 7 name = sub_cs02-20 17:00:28.810: I/xiao(17191): i = 8 name = ct_t02-20 17:00:28.810: I/xiao(17191): i = 9 name = ct_l02-20 17:00:28.810: I/xiao(17191): i = 10 name = exp02-20 17:00:28.810: I/xiao(17191): i = 11 name = m_cls02-20 17:00:28.810: I/xiao(17191): i = 12 name = m_type02-20 17:00:28.810: I/xiao(17191): i = 13 name = v02-20 17:00:28.810: I/xiao(17191): i = 14 name = m_size02-20 17:00:28.810: I/xiao(17191): i = 15 name = pri02-20 17:00:28.810: I/xiao(17191): i = 16 name = rr02-20 17:00:28.810: I/xiao(17191): i = 17 name = rpt_a02-20 17:00:28.817: I/xiao(17191): i = 18 name = resp_st02-20 17:00:28.817: I/xiao(17191): i = 19 name = st02-20 17:00:28.817: I/xiao(17191): i = 20 name = tr_id02-20 17:00:28.817: I/xiao(17191): i = 21 name = retr_st02-20 17:00:28.817: I/xiao(17191): i = 22 name = retr_txt02-20 17:00:28.817: I/xiao(17191): i = 23 name = retr_txt_cs02-20 17:00:28.817: I/xiao(17191): i = 24 name = read_status02-20 17:00:28.817: I/xiao(17191): i = 25 name = ct_cls02-20 17:00:28.817: I/xiao(17191): i = 26 name = resp_txt02-20 17:00:28.817: I/xiao(17191): i = 27 name = d_tm02-20 17:00:28.817: I/xiao(17191): i = 28 name = d_rpt02-20 17:00:28.817: I/xiao(17191): i = 29 name = locked02-20 17:00:28.817: I/xiao(17191): i = 30 name = seen02-20 17:00:28.817: I/xiao(17191): i = 31 name = deletable

sms表:

202-20 16:32:03.880: I/xiao(13974): i = 0 name = _id02-20 16:32:03.888: I/xiao(13974): i = 1 name = thread_id02-20 16:32:03.888: I/xiao(13974): i = 2 name = address02-20 16:32:03.888: I/xiao(13974): i = 3 name = person02-20 16:32:03.888: I/xiao(13974): i = 4 name = date02-20 16:32:03.888: I/xiao(13974): i = 5 name = protocol02-20 16:32:03.888: I/xiao(13974): i = 6 name = read02-20 16:32:03.888: I/xiao(13974): i = 7 name = status02-20 16:32:03.888: I/xiao(13974): i = 8 name = type02-20 16:32:03.888: I/xiao(13974): i = 9 name = reply_path_present02-20 16:32:03.888: I/xiao(13974): i = 10 name = subject02-20 16:32:03.888: I/xiao(13974): i = 11 name = body02-20 16:32:03.888: I/xiao(13974): i = 12 name = service_center02-20 16:32:03.888: I/xiao(13974): i = 13 name = locked02-20 16:32:03.888: I/xiao(13974): i = 14 name = error_code02-20 16:32:03.888: I/xiao(13974): i = 15 name = seen02-20 16:32:03.888: I/xiao(13974): i = 16 name = deletable02-20 16:32:03.888: I/xiao(13974): i = 17 name = svc_type02-20 16:32:03.888: I/xiao(13974): i = 18 name = svc_type_content

最後的效果如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.