您的位置:首页 > 移动开发 > Android开发

Android 通过监听收信箱获取短信,Cursor对象字段的详细信息

2015-11-26 14:25 609 查看
Android 通过监听收信箱获取短信,Cursor对象字段的详细信息

最近在做一个短信核查的功能,大致就是手机接收到短信之后,通过发送者号码的特征,短信中心等条件,判断是否可疑短信,然后上传到后台。

一开始用接收广播的方式,比较顺利,代码网上有很多,这里不详细说。

但是有部分手机,酷派、VIVO等品牌中的一些型号,特么的连广播都接收不到,跑不到onReceive()方法里面,接下来的操作也就无从继续了。

所以需要通过Contacts Provider,读取手机内部的数据库,获取短信信息。

ContentResolver cr = getContentResolver();
String[] projection = new String[] {"service_center","date","address","body","date_sent"};// "短信中心号码", "发送时间", "发送方号码", "短信内容"
String where = "(type=1) and date>" + lastTime;
Cursor cur = cr.query(Uri.parse("content://sms/"), projection, where, null, "date desc");  //查询收件箱数据

if ( cur != null && cur.moveToNext()) {
serviceCenterAddress = cur.getString(cur.getColumnIndex("service_center"));
timestampMillis = cur.getLong(cur.getColumnIndex("date"));
originatingAddress = cur.getString(cur.getColumnIndex("address"));
displayMessageBody = cur.getString(cur.getColumnIndex("body"));......


这段代码相信很多人都很熟悉,但是String[] projection = new String[] 里面的关键字,到底是从哪里来的呢?除了上述的几个,还有那些是可以获取到的呢?

首先我们可以通过循环,知道查询出来的Cursor对象,里面包含哪些关键字:

if ( cur != null && cur.moveToNext()) {
for(int i=0; i<100; i++){
Log.v("","测试:短信cur :"+cur.getColumnName(i));
}


当然循环100次,会崩,但是最后我们得出结果是:

11-26 14:23:34.453: V/(32574): 测试:短信cur : _id

11-26 14:23:34.453: V/(32574): 测试:短信cur : thread_id

11-26 14:23:34.453: V/(32574): 测试:短信cur : address

11-26 14:23:34.453: V/(32574): 测试:短信cur : person

11-26 14:23:34.453: V/(32574): 测试:短信cur : date

11-26 14:23:34.453: V/(32574): 测试:短信cur : date_sent

11-26 14:23:34.453: V/(32574): 测试:短信cur : protocol

11-26 14:23:34.453: V/(32574): 测试:短信cur : read

11-26 14:23:34.453: V/(32574): 测试:短信cur : status

11-26 14:23:34.453: V/(32574): 测试:短信cur : type

11-26 14:23:34.463: V/(32574): 测试:短信cur : reply_path_present

11-26 14:23:34.463: V/(32574): 测试:短信cur : subject

11-26 14:23:34.463: V/(32574): 测试:短信cur : body

11-26 14:23:34.463: V/(32574): 测试:短信cur : service_center

11-26 14:23:34.463: V/(32574): 测试:短信cur : locked

11-26 14:23:34.463: V/(32574): 测试:短信cur : sub_id

11-26 14:23:34.463: V/(32574): 测试:短信cur : error_code

11-26 14:23:34.463: V/(32574): 测试:短信cur : seen

好,从这里我们知道有18个字段,那么这18个字段出自哪里呢?

这里引用一位大神的文章:ContentProvider之读写短消息

从上我们可以得知,短消息的数据源是:/data/data/com.android.providers.telephony/mmssms.db

里面的 sms

我们可以在adb把这个文件拉出来,直接从手机系统内部pull文件出来,会失败。

应该先复制所需文件到手机内存卡(内部sd卡):

adb shell

su

cp: /data/data/com.android.providers.telephony/databases/* /mnt/sdcard/dbfiles/

注意,内存卡里面的文件夹dbfiles要先创建。

把文件拷出来之后,用DB Browser for SQLite打开:



参考[这位大神的文章] (http://blog.csdn.net/yf210yf/article/details/7268904)

官方API

_id => 自增序号 从1开始

thread_id => 对话的序号,同一发送人id相同

address => 发件人地址,手机号.如+8613811810000

person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null

date => 接收日期 long型。如1256539465022

date_sent => 发送日期 long型。

protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO

read => 是否阅读 0未读, 1已读

status => 状态 -1接收,0 complete, 64 pending, 128 failed

type => ALL = 0;

INBOX = 1;

SENT = 2;

DRAFT = 3;

OUTBOX = 4;

FAILED = 5;

QUEUED = 6;

body => 短消息内容

service_center => 短信服务中心号码编号。如+8613800755500

reply_path_present=>Is the TP-Reply-Path flag set?

Type: BOOLEAN

subject=>短信的主题

locked=>Is the message locked?

Type: INTEGER (boolean)

sub_id=> 这个在文档中找不到,参考别人列出的源码也找不到,我看到的值暂时都是-1,有待进一步探究。

error_code=>Error code associated with sending or receiving this message. 发送失败的时候才有

seen=>Has the message been seen by the user? The “seen” flag determines whether we need to show a notification.

这文章有源码看

记录完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android