国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

實例詳解Android 獲取短信會話列表

2020-04-11 11:08:18
字體:
來源:轉載
供稿:網友

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 獲取短信會話列表的全部敘述,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 砚山县| 松江区| 准格尔旗| 封丘县| 涡阳县| 北海市| 武穴市| 盖州市| 仙居县| 桃源县| 麟游县| 察隅县| 昭通市| 房产| 仙居县| 固镇县| 广德县| 航空| 金沙县| 光泽县| 治多县| 建瓯市| 迁安市| 潮州市| 晋城| 章丘市| 宁河县| 怀远县| 万年县| 平远县| 华池县| 鸡泽县| 龙海市| 新乡县| 永康市| 蒙山县| 阜新市| 改则县| 永登县| 乳山市| 兴隆县|