一、需要實現一個同系統信息一樣的功能
1)會話列表;
2)會話對話詳情;
3)系統會話增加新信息或者刪除信息等變化時做到同步;
二、實現思路
通過查詢會話表顯示會話界面,監聽會話數據庫實現與系統信息同步。通過會話id查詢會話對應的具體聊天內容,比如短信或者彩信;
看下mmssms.db中的uri有好多個,可以根據自己的需求選擇合適的uri,可以避免不必要的操作,提高效率。經過多次測試,實現以上功能需要用的信息表有:
1)會話表:content://mms-sms/conversations/
2)短信表:content://sms
3)彩信表:content://mms、content://mms/part
4)信息對應手機號碼錶:content://mms-sms/canonical-addresses
需要權限:<uses-permission android:name="android.permission.READ_SMS" />
首先:顯示會話列表
public static final Uri THREADS_URI = Uri.parse("content://mms-sms/conversations?simple=true");
threads字段:
_id
date
ct_t:區分彩信還是短信:application/vnd.wap.multipart.related是彩信,否則是短信
snippet:最新的一條會話信息。彩信爲彩信的主題,短信時短信的body
recipient_ids:信息對應手機號碼錶(content://mms-sms/canonical-addresses)中的id,查詢對應的手機號碼
message_count:詳細對話條數
read
snippet_cs:snippet的編碼方式,彩信:106(utf-8),短信:0
……
根據threads表中的date,snippet,messagecount基本可以顯示會話列表了。
另外:
1:通過4)信息對應手機號碼錶:content://mms-sms/canonical-addresses獲取了手機號之後獲取聯繫人姓名以及頭像使用:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
2:當會話爲彩信時,snippet顯示的是彩信的主題,編碼方式爲utf-8。顯示爲亂碼。
解決:snippet_mms = new String(snippet.getBytes("ISO8859_1"), "utf-8");
其次,獲取會話具體對話內容
具體對話的格式有ssm或者mms,通過content://mms-sms/conversations/threadid,可以查詢與某聯繫人的所有聊天記錄的id,這個id對應短信或者彩信表中的id。如果具體會話是短信,則去sms表中查詢具體內容,如果是彩信則去mms表中查詢。通過字段ct_t 區分信息類別。
具體實現:
1)獲取sms
String selection = "_id = "+id;
Uri uri = Uri.parse("content://sms");
Cursor cursor = contentResolver.query(uri, null, selection, null, null);
String phone = cursor.getString(cursor.getColumnIndex("address"));
int type = cursor.getInt(cursor.getColumnIndex("type"));// 2 = sent, etc.
String date = cursor.getString(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body"));
2)獲取mms
彩信表:content://mms
彩信附件:content://mms/part/
get text content from MMS:
String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cursor = getContentResolver().query(uri, null,
selectionPart, null, null);
if (cursor.moveToFirst()) {
do {
String partId = cursor.getString(cursor.getColumnIndex("_id"));
String type = cursor.getString(cursor.getColumnIndex("ct"));
if ("text/plain".equals(type)) {
String data = cursor.getString(cPart.getColumnIndex("_data"));
String body;
if (data != null) {
// implementation of this method below
body = getMmsText(partId);
} else {
body = cursor.getString(cursor.getColumnIndex("text"));
}
}
} while (cursor.moveToNext());
}
private String getMmsText(String id) {
Uri partURI = Uri.parse("content://mms/part/" + id);
InputStream is = null;
StringBuilder sb = new StringBuilder();
try {
is = getContentResolver().openInputStream(partURI);
if (is != null) {
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(isr);
String temp = reader.readLine();
while (temp != null) {
sb.append(temp);
temp = reader.readLine();
}
}
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
return sb.toString();
}
獲取彩信中圖片:
String selectionPart = "mid=" + mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cPart = getContentResolver().query(uri, null,
selectionPart, null, null);
if (cPart.moveToFirst()) {
do {
String partId = cPart.getString(cPart.getColumnIndex("_id"));
String type = cPart.getString(cPart.getColumnIndex("ct"));
if ("image/jpeg".equals(type) || "image/bmp".equals(type) ||
"image/gif".equals(type) || "image/jpg".equals(type) ||
"image/png".equals(type)) {
Bitmap bitmap = getMmsImage(partId);
}
} while (cPart.moveToNext());
}
private Bitmap getMmsImage(String _id) {
Uri partURI = Uri.parse("content://mms/part/" + _id);
InputStream is = null;
Bitmap bitmap = null;
try {
is = getContentResolver().openInputStream(partURI);
bitmap = BitmapFactory.decodeStream(is);
} catch (IOException e) {}
finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {}
}
}
return bitmap;
}
測試結果:
最後,我的會話界面與系統的實時同步
監聽系統的會話數據表即可:
public static final Uri THREADS_URI = Uri
.parse("content://mms-sms/conversations?simple=true");
getContentResolver().registerContentObserver(THREADS_URI ,true, sysCallLogObserver);
另外:
我只寫了自己用的表字段,如果想字段別的可以自己打印下:
cursor.getColumnNames();
資料:
http://www.cnblogs.com/kakafra/archive/2012/10/06/2713327.html