編輯:關於Android編程
Android中的短信並沒有正式的content provider可用,在官方文檔中沒有提供定義。不過依然可以自己定義好URI,然後查詢出短信內容。例如conetent://sms則是所有短信所在的path。
要將短信按會話分類,原先我是查詢出所有短信後,然後再按照thread_id分類。系統自帶的短信程序包含一個會話顯示界面,每個條目包含:聯系人、短信數量、第一條短信等內容。當我的程序處理的短信較多時,一次查詢出所有的短信就變得很慢。(如果再加上為每個會話查詢聯系人信息,則會更慢)
看了系統短信的代碼,發現它可以只查詢出會話的信息,而不用查詢出所有短信內容。因為部分代碼沒找到,一直不知道它是怎麼做到的。看了telphony provider的代碼後,才知曉一二。
實際上,短信數據庫中(mmssms.db)並沒有一個表存儲會話信息的。系統提供的content provider中,實際上是支持直接查詢會話信息的。只不過,其實現方式,不是通過一個現成的表,而是通過SQL語句,從多個表裡取數據完成的。關於這個實現方式,在這個帖子中也有所提及。
實現方式就不深究了,畢竟我對SQL查詢不太熟。放出直接的使用方法:
獲取會話信息的URI
Java代碼
public static final Uri MMSSMS_FULL_CONVERSATION_URI = Uri.parse("content://mms-sms/conversations"); public static final Uri CONVERSATION_URI = MMSSMS_FULL_CONVERSATION_URI.buildUpon(). appendQueryParameter("simple", "true").build(); public static final Uri MMSSMS_FULL_CONVERSATION_URI = Uri.parse("content://mms-sms/conversations"); public static final Uri CONVERSATION_URI = MMSSMS_FULL_CONVERSATION_URI.buildUpon(). appendQueryParameter("simple", "true").build();
通過指定simple=true,則可以獲取出一個大概的會話數據,包含以下列:
Java代碼
private static final int ID = 0; private static final int DATE = 1; private static final int MESSAGE_COUNT = 2; private static final int RECIPIENT_IDS = 3; private static final int SNIPPET = 4; private static final int SNIPPET_CS = 5; private static final int READ = 6; private static final int TYPE = 7; private static final int ERROR = 8; private static final int HAS_ATTACHMENT = 9;
列名則為:
Java代碼
private static final String[] ALL_THREADS_PROJECTION = { "_id", "date", "message_count", "recipient_ids", "snippet", "snippet_cs", "read", "error", "has_attachment" };
其中:
1、message_count為該會話的消息數量;
2、recipient_ids為聯系人ID,這個ID不是聯系人表中的_id,而是指向表 canonical_addresses 裡的id,canonical_addresses這個表同樣位於mmssms.db,它映射了recipient_ids到一個電話號碼,也就是說,最終獲取聯系人信息,還是得通過電話號碼;
3、snippet為最後收到/發送的短信;
每個數據的類型嘛,大致為:
Java代碼
long id = cursor.getLong(ID); long date = cursor.getLong(DATE); long msgCount = cursor.getLong(MESSAGE_COUNT); String recipIDs = cursor.getString(RECIPIENT_IDS); String snippet = cursor.getString(SNIPPET); long snippetCS = cursor.getLong(SNIPPET_CS); long read = cursor.getLong(READ); long type = cursor.getLong(TYPE); long error = cursor.getLong(ERROR); long hasAttach = cursor.getLong(HAS_ATTACHMENT); long id = cursor.getLong(ID); long date = cursor.getLong(DATE); long msgCount = cursor.getLong(MESSAGE_COUNT); String recipIDs = cursor.getString(RECIPIENT_IDS); String snippet = cursor.getString(SNIPPET); long snippetCS = cursor.getLong(SNIPPET_CS); long read = cursor.getLong(READ); long type = cursor.getLong(TYPE); long error = cursor.getLong(ERROR); long hasAttach = cursor.getLong(HAS_ATTACHMENT);
以上內容是小編給大家介紹的Android 獲取短信會話列表的全部敘述,希望大家喜歡。
Filter閱讀是我最近寫的一個Android的閱讀器,用於看英文的書(中文暫時不支持,會亂碼,下一版再改).在這裡開源給大家(Android studio的)源碼下載地
本文實例為大家分享了Android動態GridView控件使用的具體代碼,供大家參考,具體內容如下MainActivity.java代碼:package siso.hah
我們分析一些源碼的實現.首先從PMS服務開始.PMS服務即PackageManagerService,主要用來進行APK的管理任務.但是今天,我們並不直接分析PMS的源碼
前幾天,收到了Android Studio 2.2的更新推送,於是迫不及待的更新了一下。不負眾望Android Studio 2.2帶來了很多新的特性,能讓我眼前一亮。A