Android 短信解析

URI主要有:

content://sms/               所有短信
content://sms/inbox        收件箱
content://sms/sent          已发送
content://sms/draft         草稿
content://sms/outbox     发件箱
content://sms/failed       发送失败
content://sms/queued    待发送列表



sms主要结构:  
  1. _id => 短消息序号 如100  
  2. thread_id => 对话的序号 如100  
  3. address => 发件人地址,手机号.如+8613811810000  
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否阅读 0未读, 1已读   
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 类型 1是接收到的,2是已发出   
  10. body => 短消息内容   
  11. service_center => 短信服务中心号码编号。如+8613800755500  
String[] projection = new String[]{"address", "body"};
Cursor cursor = getContentResolver().query(uri, projection, "where .." new String[]{"", ""}, "order by ..")





Android短信存储数据库

偶然发现了Android源码中的一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mmssms.db中。

公开的SDK中没有这个类,不能直接使用。于是自己写了一个SQLiteOpenHelper,但是查询的时候发生SQL异常。看来不能为所欲为了,不过据网上资料介绍可以拷贝db文件来实现短信数据备份。


MmsSmsDatabaseHelper.java在Android源码中的路径:

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


sms数据库中的字段如下:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null 
date            发件日期
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     短信服务中心号码编号
subject                  短信的主题
reply_path_present     TP-Reply-Path
locked    


sms数据库表字段类型的源码:


[java]  view plain copy print ?
  1. private void createSmsTables(SQLiteDatabase db) {  
  2.         // N.B.: Whenever the columns here are changed, the columns in  
  3.         // {@ref MmsSmsProvider} must be changed to match.  
  4.         db.execSQL("CREATE TABLE sms (" +  
  5.                    "_id INTEGER PRIMARY KEY," +  
  6.                    "thread_id INTEGER," +  
  7.                    "address TEXT," +  
  8.                    "person INTEGER," +  
  9.                    "date INTEGER," +  
  10.                    "date_sent INTEGER DEFAULT 0," +  
  11.                    "protocol INTEGER," +  
  12.                    "read INTEGER DEFAULT 0," +  
  13.                    "status INTEGER DEFAULT -1," + // a TP-Status value  
  14.                                                   // or -1 if it  
  15.                                                   // status hasn't  
  16.                                                   // been received  
  17.                    "type INTEGER," +  
  18.                    "reply_path_present INTEGER," +  
  19.                    "subject TEXT," +  
  20.                    "body TEXT," +  
  21.                    "service_center TEXT," +  
  22.                    "locked INTEGER DEFAULT 0," +  
  23.                    "error_code INTEGER DEFAULT 0," +  
  24.                    "seen INTEGER DEFAULT 0" +  
  25.                    ");");  
  26. ....  
  27. }  


packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


联系人为空

短信数据库里面如果你是先受到陌生短信之后再把陌生人添加到联系人列表的话,短信数据库里面的person字段就为null,如果你是先添加联系人再发短 信的话,短信数据库里面的person字段就不为空了,所以你要是想通过短信数据库里的字段取得联系人的其他信息的话,只能通过地址来取。

实例:
  1.  public String getSmsInPhone() {  
  2.         final String SMS_URI_ALL = "content://sms/";  
  3.         final String SMS_URI_INBOX = "content://sms/inbox";  
  4.         final String SMS_URI_SEND = "content://sms/sent";  
  5.         final String SMS_URI_DRAFT = "content://sms/draft";  
  6.         final String SMS_URI_OUTBOX = "content://sms/outbox";  
  7.         final String SMS_URI_FAILED = "content://sms/failed";  
  8.         final String SMS_URI_QUEUED = "content://sms/queued";  
  9.   
  10.         StringBuilder smsBuilder = new StringBuilder();  
  11.   
  12.         try {  
  13.             Uri uri = Uri.parse(SMS_URI_ALL);  
  14.             String[] projection = new String[] { "_id""address""person""body""date""type" };  
  15.             Cursor cur = getContentResolver().query(uri, projection, nullnull"date desc");      // 获取手机内部短信  
  16.   
  17.             if (cur.moveToFirst()) {  
  18.                 int index_Address = cur.getColumnIndex("address");  
  19.                 int index_Person = cur.getColumnIndex("person");  
  20.                 int index_Body = cur.getColumnIndex("body");  
  21.                 int index_Date = cur.getColumnIndex("date");  
  22.                 int index_Type = cur.getColumnIndex("type");  
  23.   
  24.                 do {  
  25.                     String strAddress = cur.getString(index_Address);  
  26.                     int intPerson = cur.getInt(index_Person);  
  27.                     String strbody = cur.getString(index_Body);  
  28.                     long longDate = cur.getLong(index_Date);  
  29.                     int intType = cur.getInt(index_Type);  
  30.   
  31.                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  32.                     Date d = new Date(longDate);  
  33.                     String strDate = dateFormat.format(d);  
  34.   
  35.                     String strType = "";  
  36.                     if (intType == 1) {  
  37.                         strType = "接收";  
  38.                     } else if (intType == 2) {  
  39.                         strType = "发送";  
  40.                     } else {  
  41.                         strType = "null";  
  42.                     }  
  43.   
  44.                     smsBuilder.append("[ ");  
  45.                     smsBuilder.append(strAddress + ", ");  
  46.                     smsBuilder.append(intPerson + ", ");  
  47.                     smsBuilder.append(strbody + ", ");  
  48.                     smsBuilder.append(strDate + ", ");  
  49.                     smsBuilder.append(strType);  
  50.                     smsBuilder.append(" ]\n\n");  
  51.                 } while (cur.moveToNext());  
  52.   
  53.                 if (!cur.isClosed()) {  
  54.                     cur.close();  
  55.                     cur = null;  
  56.                 }  
  57.             } else {  
  58.                 smsBuilder.append("no result!");  
  59.             } // end if  
  60.   
  61.             smsBuilder.append("getSmsInPhone has executed!");  
  62.   
  63.         } catch (SQLiteException ex) {  
  64.             Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  
  65.         }  
  66.   
  67.         return smsBuilder.toString();  
  68.     }  

转载于:https://my.oschina.net/tingzi/blog/103717

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.Net网站部署失败

部署站点时候,出现如下错误 “/”应用程序中的服务器错误。 --------------------------------------------------------------------------------当前标识(NT AUTHORITY\SYSTEM)没有对“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files”的…

Linux系统开机自动加载驱动module

Linux系统的驱动默认存放目录为: /lib/modules/$(uname -r)/kernel/drivers,因此如果希望系统可以启动时自动加载驱动必须首先把驱动放到该目录下面,执行完此步操作以后,再执行 depmod 命令更新驱动依赖关系文件 modules.dep&…

FineReport报表和J2EE应用的集成

From: http://www.blogjava.net/fannie/archive/2013/05/08/398985.html FineReport是一个纯Java软件,因此对于J2EE的项目,可以做到无缝集成。 报表服务器并非物理概念的服务器,而是以一个标准的J2EE应用的形式或者jar包的形式提交给程序。应…

vue使用jszip和file-save下载文件并打包;vue前端下载多个文件b并打包;

场景: 一般是后端直接将多个文件打包好,前端调用下载地址下载打包;但是文件太多会导致下载接口时间过长和服务器爆掉;故采用前端先将多个文件下载然后进行打包; 注意点: 1.先获取所有下载的文件路径和包含后…

【BZOJ1085】骑士精神

迭代加深搜索。 剪枝&#xff1a;当满足以下任意一个条件退出&#xff1a; 1.当前已搜到答案时&#xff08;ans!-1||sum0&#xff09; 2.剩余步数1<当前局面与目标局面不同的格子数sum 时&#xff08;因为n步最多改变n1个格子&#xff09; 3.当前步数>当前规定最大步数时…

CH340电路设计注意事项

在前面两篇博客提到了CH340的电路设计以及芯片选型&#xff0c;本文将重点放在使用CH340芯片进行电路设计的一些细节与注意事项。 电压匹配问题 CH340 芯片通过 USB 转换出来的 TTL 串口输出和输入电压是根据芯片供电电压是自适应的。也即&#xff0c;如果芯片是 5V 供电&…

解决 Visual Studio 中代码注释自动折叠的问题

今天突发奇想&#xff0c;打算把存储过程以注释的形式放在代码中进行版本管理&#xff0c;比如下面的代码&#xff1a; 由于存储过程很长&#xff0c;注释占了很多行&#xff0c;严复影响了正常代码的排版与阅读体验。之前也遇到过这样的场景&#xff0c;当时通过手动添加regio…

Newtonsoft.Json高级用法

From: http://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快&#xff0c;体验好。刚好手头上的一个项目服务端接口有性能问题&#xff0c;需要进行优化。在接口多次修改中&#xff0c;实体添加了很多字段用于中间计算或者存储&#xff0c;然后最终用Newtonso…

CH340驱动(含各平台)

CH340转串口芯片支持的平台驱动齐全&#xff0c;支持 Windows/Linux/Android/MacOS/WinCE 等各主流系统。下面就给出各平台下驱动官网链接和简要说明&#xff0c;每个平台的安装与使用问题可以参见我的其他博文。 Windows驱动 下载链接&#xff1a;CH340/CH341 Windows 驱动链…

js获取文件名后缀

this.fileType this.file.name.split(.)[this.file.name.split(.).length - 1]

PHP笔记-管道的作用 类

echo 123 | sudo -S /bin/bash -c cp god* /usr/local/bin | 就是管道 作用是将前面的结果作为后面的参数使用 123就是sudo的密码 -c &#xff08;command命令&#xff09; cp god* /usr/local/bin将以god开头的文件拷贝到/usr/local/bin文件中 god* 以god开头的文件 /bin/b…

Android 经典示例,初学者的绝好源码资料

2019独角兽企业重金招聘Python工程师标准>>> Android 经典示例&#xff0c;初学者的绝好源码资料 附上源码&#xff1a; 转载:http://www.adobex.com/android/source/details/00000374.htm 转载于:https://my.oschina.net/androidcode/blog/104696

USB转串口驱动(支持各平台)

CH340转串口芯片支持的平台驱动齐全&#xff0c;支持 Windows/Linux/Android/MacOS/WinCE 等各主流系统。下面就给出各平台下驱动官网链接和简要说明&#xff0c;每个平台的安装与使用问题可以参见我的其他博文。 Windows驱动 下载链接&#xff1a;CH340/CH341 Windows 驱动链…

【DOS】对指定目录下的指定文件类型进行打包

echo offset packagepack.rar set dirsLoginServer Launcher GlobalLauncher GameLauncherdel %package%REM 对指定目录下的指定文件类型进行打包 for %%i in (%dirs%) do rar a %package% %%i\*.dll %%i\*.pdb %%i\*.exe.* %%i\*.xml说明&#xff1a; 1. 以上不会去子目录下搜…

CH340 Linux驱动使用教程

在官方Linux内核版本中自Kernel2.6以后就默认包含了对CH340/CH341芯片的驱动支持了&#xff0c;但比较遗憾的是该自带驱动版本较老&#xff08;由开源社区开发者提交&#xff09;已不能满足使用需求了&#xff0c;因此我们需要用芯片官网提供的新驱动进行替换链接。 1. 首先去…

关于页面图表相应式的问题,问题遇见时间,9月1日,到今天9月2日,尚未解决...

首先&#xff0c;我在做公司的新的软件页面&#xff0c;后台页面&#xff0c;遇到的问题是当我引入百度的echarts.js&#xff0c;想使用他们的插件来实现图表的功能&#xff0c;发现JS的信息描述必须放在他们div id的下面&#xff0c;否则会失效&#xff0c;这是问题一。 现在遇…

h5开发实时预览;真机调试开发;拼接ip的地址直接微信打开或者浏览器打开也可以实时预览

http://192.168.10.135:2277/#/Write1 本地启动vue项目 将地址栏复制 放在微信开发者工具 可以借助微信开发者工具预览 找到自己电脑的ip 也可以电脑输入自己的ip和对应端口号地址进行预览 最后将拼接ip和端口号的地址直接微信打开或者浏览器打开也可以实时预览

Android广播接实现电话的监听(电话的状态,拦截)

Android广播接实现电话的监听 1&#xff1a;需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name"android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name"android.permission.READ_PHONE_STATE" /…

CH340 MAC驱动使用教程

CH340 支持各类系统平台下使用&#xff0c;驱动的使用以及下载介绍可以参见我的其他博客&#xff1a;CH340 驱动&#xff08;含各平台&#xff09; 这一篇文章主要介绍CH340 在 MAC 以及各类 Arduino 平台的安装使用流程&#xff0c;首先到沁恒官网下载最新的CH340驱动&#x…

python基础2

本节内容 列表、元组操作字符串操作字典操作集合操作文件操作字符编码与转码 一、列表、元组操作 列表是我们最以后最常用的数据类型之一&#xff0c;通过列表可以对数据实现最方便的存储、修改等操作 定义列表 >>> name [hongpeng,21,ops] 通过下标访问列表中的元素…