android 读取短信 按号码封装JSONObject
由于项目需要管理本地手机的短信内容,所以需要读取并封装成JSONObject格式。 首先,我们需要获取短信的内容,包括短短信对应的电话号码,发送时间,发送内容,短信是接收还是发送的,短信是已读还是未读,然后根据对应的短信号码来找到联系人的姓名和头像,最后将这些信息以键值对的形式存入JSONObject和JSONArray中。当然,也可以读会话列表的_id形式,按照短信会话形式读取短信的电话号码和会话中的短信条数、未读短信数目、最新一条短信内容并显示。会话读取将在下一篇文章里写出。
首先,获取读取短信的权限:在工程中的AndroidManifest.xml中加入android.permission.READ_SMS这个permission
<uses-permission android:name="android.permission.READ_SMS" />
然后,android手机短信的URI主要有:
content://sms/ 所有短信
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
sms主要结构:
- _id => 短消息序号 如100
- thread_id => 对话的序号 如100
- address => 发件人地址,手机号.如+8613811810000
- person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
- date => 日期 long型。如1256539465022
- protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO
- read => 是否阅读 0未读, 1已读
- status => 状态 -1接收,0 complete, 64 pending, 128 failed
- type => 类型 1是接收到的,2是已发出
- body => 短消息内容
- service_center => 短信服务中心号码编号。如+8613800755500
String[] projection = new String[]{"address", "body"};
Cursor cursor = getContentResolver().query(uri, projection, "where .." new String[]{"", ""}, "order by ..")
其中,getContentResolver().query()函数
- public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 我们本次用到的是这个参数的query函数,但query函数的参数形式不止这一种。例如:

第一个参数,uri。Android提供内容的叫Provider,在Android中区分各个提供联系人、提供图片、提供音视频的Provider,依据的是这个唯一的标识Uri,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者。
第二个参数,project,是string[]类型,它告知了Provider要返回的内容。
第三个参数,selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。
第四个参数,selectionArgs
第五个参数,sortOrder,设置条件,相当于将数据库的数据按照这个顺序排列,然后按顺序来读取数据。

浙公网安备 33010602011771号