android读取短信彩信
会话列表的读取通过查询content://mms-sms/conversations?易做图=true这个Url可以获得到,由于里面有彩信和短信,处理方式如下:
[java]
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 = 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去查,每次都会出现空指针异常,源码内这个参数是:
[java]
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"};
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,是否为发送的短信存储在一个对象中(我自己定义的类对象),然后把这个对象存储在List<MessageBase> mMessageList中,然后从彩信数据库中查询出threadid和现在的threadid一样的所有彩信(content://mms),然后把date, subject, 图片,是否为发送的彩信存储在一个对象中(我自己定义的类对象),然后存储在mMessageList中,当然彩信和短信对象的类都是继承自一个基类,然后对mMessageList依据date相进行排序,在这个排序的过程中由于彩信是以秒来记录的,而短信是以毫秒来记录的,所以在排序前需要进行1000的缩放,排好序后的mMessageList和手机短信中的列表一致了,然后进行显示,这个显示是采用一个ListView,重写Adapter(如上一篇博客--重写ListView Adapter)。
以下是MessageBase的定义:
[java]
public class MessageBase {
public long mDate;
public String mThreadId;
public String mId;
public boolean mIsSms;
public boolean mIsInbox;
}
public class MessageBase {
public long mDate;
public String mThreadId;
public String mId;
public boolean mIsSms;
public boolean mIsInbox;