【android】 短信彩信以及會話讀取

一、需要實現一個同系統信息一樣的功能

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

http://johnsonxu.iteye.com/blog/1406782

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章