Android 通过监听收信箱获取短信,Cursor对象字段的详细信息
2015-11-26 14:25
609 查看
Android 通过监听收信箱获取短信,Cursor对象字段的详细信息
最近在做一个短信核查的功能,大致就是手机接收到短信之后,通过发送者号码的特征,短信中心等条件,判断是否可疑短信,然后上传到后台。
一开始用接收广播的方式,比较顺利,代码网上有很多,这里不详细说。
但是有部分手机,酷派、VIVO等品牌中的一些型号,特么的连广播都接收不到,跑不到onReceive()方法里面,接下来的操作也就无从继续了。
所以需要通过Contacts Provider,读取手机内部的数据库,获取短信信息。
这段代码相信很多人都很熟悉,但是String[] projection = new String[] 里面的关键字,到底是从哪里来的呢?除了上述的几个,还有那些是可以获取到的呢?
首先我们可以通过循环,知道查询出来的Cursor对象,里面包含哪些关键字:
当然循环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.
这文章有源码看
记录完毕。
最近在做一个短信核查的功能,大致就是手机接收到短信之后,通过发送者号码的特征,短信中心等条件,判断是否可疑短信,然后上传到后台。
一开始用接收广播的方式,比较顺利,代码网上有很多,这里不详细说。
但是有部分手机,酷派、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.
这文章有源码看
记录完毕。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories