由於項目需要讀取手機內的簡訊和多媒體訊息資料,不知道如何來處理,本來這個項目是別人做的,後來讓我來修改,都是百度點代碼粘貼上去,一問為啥這樣處理,都是說網上找的代碼,我對我修改後的東西做了下整理,首先感謝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
最後的效果如下: