android的短信保存在短信库里,但并提供类似Contacts的公开的Content Provider方便操作。这里简单的介绍下:android中的短信信息保存在/data/data/com.android.providers.telephony/databases目录下的sqlite库中。常用的表有:canonical_addresses, sms, threads。对短信的操作基本也就是对这些表的CRUD。下面先看下这些表的结构,也可以使用sql查看表中的内容
d:\test>adb shell$ susu# cd /data/data/com.android.providers.telephony/databasescd /data/data/com.android.providers.telephony/databases# lslsfirewall.db       mmssms.db-wal     telephony.db-shmmmssms.db         msmsms.db         telephony.db-walmmssms.db-shm     telephony.db      traffic.db# sqlite3 mmssms.dbsqlite3 mmssms.dbSQLite version 3.7.2Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite> .tables.tablesaddr                 pdu                  threadsandroid_metadata     pending_msgs         wordsattachments          rate                 words_contentcanonical_addresses  raw                  words_segdirdrm                  sms                  words_segmentspart                 sr_pendingsqlite> .schema threads.schema threadsCREATE TABLE threads (_id INTEGER PRIMARY KEY,date INTEGER DEFAULT 0,server_date INTEGER DEFAULT 0,message_count INTEGER DEFAULT 0,unread_count INTEGER DEFAULT 0,photo_id TEXT,recipient_addresses TEXT,recipient_names TEXT,is_sp TEXT,person_id TEXT,recipient_ids TEXT,snippet TEXT,snippet_cs INTEGER DEFAULT 0,read INTEGER DEFAULT 1,type INTEGER DEFAULT 0,error INTEGER DEFAULT 0,has_attachment INTEGER DEFAULT 0,state INTEGER DEFAULT 0);sqlite> .schema sms.schema smsCREATE TABLE sms (_id INTEGER PRIMARY KEY,thread_id INTEGER,address TEXT,person INTEGER,date INTEGER,server_date INTEGER,protocol INTEGER,read INTEGER DEFAULT 0,status INTEGER DEFAULT -1,type INTEGER,reply_path_present INTEGER,subject TEXT,body TEXT,service_center TEXT,locked INTEGER DEFAULT 0,error_code INTEGER DEFAULT 0,seen INTEGER DEFAULT 0,timed INTEGER DEFAULT 0);
(这里需要注意的是查看/data/data目录下的文件需要有root权限)


sms表中的主要字段介绍:
_id 短消息序号
thread_id 关联threads表中的id,对话的序号
address 发件人地址,手机号
person 发件人,返回一个数字就是联系人列表里的序号
date 日期 long型
protocol 协议 0 SMS_RPOTO, 1 MMS_PROTO
read 是否阅读 0未读, 1已读
status 状态 -1接收,0 complete, 64 pending, 128 failed
type 类型 1是接收到的,2是已发出
body 短消息内容
service_center 短信服务中心号码编号

// 读取收件箱中指定号码的短信Cursor cursor = managedQuery(Uri.parse("content://sms/inbox"),new String[] { "_id", "address", "body", "read" }, " address=? and read=?", new String[] { "106597281","0" }, "date desc");if (cursor != null) {ContentValues values = new ContentValues();values.put("read", "1");// 修改短信为已读模式cursor.moveToFirst();if (cursor.moveToFirst()) {// 根据id修改短信的状态为已读状态getContentResolver().update(Uri.parse("content://sms/inbox"), values, " _id=?",new String[] { "" + cursor.getInt(0) });// 删除指定号码的短信int smsId = cursor.getInt(0);String msgbody = cursor.getString(cursor.getColumnIndexOrThrow("body"));try {msgbody = (new String(msgbody.getBytes(), "utf8")).trim();} catch (UnsupportedEncodingException e) {Log.e("TAG", "", e);}// 删除指定短信getContentResolver().delete(Uri.parse("content://sms/" + smsId), null, null);}}cursor.close();


另外值得注意的是调用SMSManager.sendTextMessage接口发送短信是不会将信息写入到sms表中的,若需要记录到表中就需要添加写入sms表的操作了。
总的来说对短信的操作还是挺简单的,复杂点的就是需要考虑提升从表中读取数据的效率。

更多相关文章

  1. android 中管理短信
  2. Android关于短信加密
  3. Android(安卓)监听短信2种方式:Broadcast和ContentObserver
  4. android 手机Phone进程下无权限发送短信问题的解决办法
  5. 详解Android短信的发送和广播接收实现短信的监听
  6. Android(安卓)SMS(二)—— 读取短信保存到 SQLite
  7. android 短信发送器
  8. 【Android】利用广播Broadcast接收SMS短信
  9. android收发短信

随机推荐

  1. android 数据存储的四种方式.
  2. Android(安卓)kotlin DataBinding 之 unr
  3. android input 命令总结
  4. Android.mk文件语法规范
  5. DroidBox简介
  6. 翻译:创造性的视觉
  7. Android(安卓)UI设计——AutoCompleteTex
  8. Android2017-2018最新面试题(3-5年经验个
  9. chromium编译与支持H264编码支持
  10. android短彩信数据库设计源码解析(一)