Android中的短信并没有正式的content provider可用,在官方文档中没有提供定义。不过依然可以自己定义好URI,然后查询出短信内容。例如conetent://sms则是所有短信所在的path。
要将短信按会话分类,原先我是查询出所有短信后,然后再按照thread_id分类。系统自带的短信程序包含一个会话显示界面,每个条目包含:联
系人、短信数量、第一条短信等内容。当我的程序处理的短信较多时,一次查询出所有的短信就变得很慢。(如果再加上为每个会话查询联系人信息,则会更慢)
看了系统短信的代码,发现它可以只查询出会话的信息,而不用查询出所有短信内容。因为部分代码没找到,一直不知道它是怎么做到的。看了telphony provider的代码后,才知晓一二。
实际上,短信数据库中(mmssms.db)并没有一个表存储会话信息的。系统提供的content provider中,实际上是支持直接查询会话信息的。
只不过,其实现方式,不是通过一个现成的表,而是通过SQL语句,从多个表里取数据完成的。关于这个实现方式,在这个帖子中
也有所提及。
实现方式就不深究了,毕竟我对SQL查询不太熟。放出直接的使用方法:
获取会话信息的URI
-
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,则可以获取出一个大概的会话数据,包含以下列:
-
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
;
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;
列名则为:
-
private
static
final
String[] ALL_THREADS_PROJECTION = {
-
"_id"
,
"date"
,
"message_count"
,
"recipient_ids"
,
-
"snippet"
,
"snippet_cs"
,
"read"
,
"error"
,
"has_attachment"
-
};
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为最后收到/发送的短信;
每个数据的类型嘛,大致为:
-
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获取手机短信
Qt android 发短信,查看短信
android smssdk 接入短信验证实现注册登录 博客介绍: http://blog.csdn.net/qq_33078541/article/details/50736700
Android SMSNotify Android 短信通知源码 Android SMSNotify Android 短信通知源码
Android版短信 筛选/批量删除 程序(支持Android2.3~4.4)
android备份短信 安卓备份短信 老鸟勿入
Android备份短信和通讯录
在Android中,利用Intent启动系统短信界面
Android发送短信程序,需要的可以下下来看看。
4.2 短信管理软件程序中各类组件 21 4.2.1 Package Explorer中的组件 22 4.2.2 应用程序的资源 22 4.2.3 布局文件main.xml 22 4.2.4 AndroidManifest.xml 23 4.3 手机短信软件设计实现 24 4.3.1 系统主界面的实现 24...
本例为使用android发送短信的例子 为本人习作 可以在android2.3之上运行
及时刷新短信内容,获取手机短信信息。让我可以上传短信给后台
Android系统软件源码(联系人,短信,相机,浏览器,拨号,音乐,视频等)
Android4.4+短信拦截删除,Android4.4或者更高版本短信拦截与删除。本人在Android4.4.4红米上测试通过
android手机短信源码,一个挺不错的东西,学习android的兄弟们可以参考下了
Android 中最漂亮的短信App
主要介绍了获取Android手机中所有短信的实现代码,需要的朋友可以参考下
【Android】短信应用——短信发送Demo 相关文章:http://blog.csdn.net/etzmico/article/details/6874775