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 => 协议0SMS_RPOTO,1MMS_PROTO
- read => 是否阅读0未读,1已读
- status => 状态 -1接收,0complete,64pending,128failed
- type => 类型1是接收到的,2是已发出
- body => 短消息内容
- service_center => 短信服务中心号码编号。如+8613800755500
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 协议,分为:0SMS_RPOTO,1MMS_PROTO
read 是否阅读0未读,1已读
status 状态-1接收,0complete,64pending,128failed
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数据库表字段类型的源码:
- privatevoidcreateSmsTables(SQLiteDatabasedb){
- //N.B.:Wheneverthecolumnsherearechanged,thecolumnsin
- //{@refMmsSmsProvider}mustbechangedtomatch.
- db.execSQL("CREATETABLEsms("+
- "_idINTEGERPRIMARYKEY,"+
- "thread_idINTEGER,"+
- "addressTEXT,"+
- "personINTEGER,"+
- "dateINTEGER,"+
- "date_sentINTEGERDEFAULT0,"+
- "protocolINTEGER,"+
- "readINTEGERDEFAULT0,"+
- "statusINTEGERDEFAULT-1,"+//aTP-Statusvalue
- //or-1ifit
- //statushasn't
- //beenreceived
- "typeINTEGER,"+
- "reply_path_presentINTEGER,"+
- "subjectTEXT,"+
- "bodyTEXT,"+
- "service_centerTEXT,"+
- "lockedINTEGERDEFAULT0,"+
- "error_codeINTEGERDEFAULT0,"+
- "seenINTEGERDEFAULT0"+
- ");");
- ....
- }
packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
联系人为空
短信数据库里面如果你是先受到陌生短信之后再把陌生人添加到联系人列表的话,短信数据库里面的person字段就为null,如果你是先添加联系人再发短 信的话,短信数据库里面的person字段就不为空了,所以你要是想通过短信数据库里的字段取得联系人的其他信息的话,只能通过地址来取。
实例:- publicStringgetSmsInPhone(){
- finalStringSMS_URI_ALL="content://sms/";
- finalStringSMS_URI_INBOX="content://sms/inbox";
- finalStringSMS_URI_SEND="content://sms/sent";
- finalStringSMS_URI_DRAFT="content://sms/draft";
- finalStringSMS_URI_OUTBOX="content://sms/outbox";
- finalStringSMS_URI_FAILED="content://sms/failed";
- finalStringSMS_URI_QUEUED="content://sms/queued";
- StringBuildersmsBuilder=newStringBuilder();
- try{
- Uriuri=Uri.parse(SMS_URI_ALL);
- String[]projection=newString[]{"_id","address","person","body","date","type"};
- Cursorcur=getContentResolver().query(uri,projection,null,null,"datedesc");//获取手机内部短信
- if(cur.moveToFirst()){
- intindex_Address=cur.getColumnIndex("address");
- intindex_Person=cur.getColumnIndex("person");
- intindex_Body=cur.getColumnIndex("body");
- intindex_Date=cur.getColumnIndex("date");
- intindex_Type=cur.getColumnIndex("type");
- do{
- StringstrAddress=cur.getString(index_Address);
- intintPerson=cur.getInt(index_Person);
- Stringstrbody=cur.getString(index_Body);
- longlongDate=cur.getLong(index_Date);
- intintType=cur.getInt(index_Type);
- SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");
- Dated=newDate(longDate);
- StringstrDate=dateFormat.format(d);
- StringstrType="";
- if(intType==1){
- strType="接收";
- }elseif(intType==2){
- strType="发送";
- }else{
- strType="null";
- }
- smsBuilder.append("[");
- smsBuilder.append(strAddress+",");
- smsBuilder.append(intPerson+",");
- smsBuilder.append(strbody+",");
- smsBuilder.append(strDate+",");
- smsBuilder.append(strType);
- smsBuilder.append("]\n\n");
- }while(cur.moveToNext());
- if(!cur.isClosed()){
- cur.close();
- cur=null;
- }
- }else{
- smsBuilder.append("noresult!");
- }//endif
- smsBuilder.append("getSmsInPhonehasexecuted!");
- }catch(SQLiteExceptionex){
- Log.d("SQLiteExceptioningetSmsInPhone",ex.getMessage());
- }
- returnsmsBuilder.toString();
- }
更多相关文章
- android 生成xml文件
- android获取程序安装时间
- Android短信备份
- Android-NDK开发之基础--Android(安卓)JNI实例代码(二)-- 获取/
- 读取联系人 2.0
- android viewpage的施用
- Android(安卓)ApiDemos示例解析(102):Views->Auto Complete->4.
- android textview 显示表情和文字 表情带超链接
- android studio 权限类,不断更新中 如果你有权限我这边没有 请告