Android SMS Read

[java] view plain copy print ?
  1. packagecom.homer.sms;
  2. importjava.sql.Date;
  3. importjava.text.SimpleDateFormat;
  4. importandroid.app.Activity;
  5. importandroid.database.Cursor;
  6. importandroid.database.sqlite.SQLiteException;
  7. importandroid.net.Uri;
  8. importandroid.os.Bundle;
  9. importandroid.util.Log;
  10. importandroid.widget.ScrollView;
  11. importandroid.widget.TableLayout;
  12. importandroid.widget.TextView;
  13. /**
  14. *读取手机短信
  15. *
  16. *@authorsunboy_2050
  17. *@sincehttp://blog.csdn.net/sunboy_2050
  18. *@date2012.03.06
  19. */
  20. publicclasssmsReadextendsActivity{
  21. @Override
  22. publicvoidonCreate(BundlesavedInstanceState){
  23. super.onCreate(savedInstanceState);
  24. TextViewtv=newTextView(this);
  25. tv.setText(getSmsInPhone());
  26. ScrollViewsv=newScrollView(this);
  27. sv.addView(tv);
  28. setContentView(sv);
  29. }
  30. publicStringgetSmsInPhone(){
  31. finalStringSMS_URI_ALL="content://sms/";
  32. finalStringSMS_URI_INBOX="content://sms/inbox";
  33. finalStringSMS_URI_SEND="content://sms/sent";
  34. finalStringSMS_URI_DRAFT="content://sms/draft";
  35. finalStringSMS_URI_OUTBOX="content://sms/outbox";
  36. finalStringSMS_URI_FAILED="content://sms/failed";
  37. finalStringSMS_URI_QUEUED="content://sms/queued";
  38. StringBuildersmsBuilder=newStringBuilder();
  39. try{
  40. Uriuri=Uri.parse(SMS_URI_ALL);
  41. String[]projection=newString[]{"_id","address","person","body","date","type"};
  42. Cursorcur=getContentResolver().query(uri,projection,null,null,"datedesc");//获取手机内部短信
  43. if(cur.moveToFirst()){
  44. intindex_Address=cur.getColumnIndex("address");
  45. intindex_Person=cur.getColumnIndex("person");
  46. intindex_Body=cur.getColumnIndex("body");
  47. intindex_Date=cur.getColumnIndex("date");
  48. intindex_Type=cur.getColumnIndex("type");
  49. do{
  50. StringstrAddress=cur.getString(index_Address);
  51. intintPerson=cur.getInt(index_Person);
  52. Stringstrbody=cur.getString(index_Body);
  53. longlongDate=cur.getLong(index_Date);
  54. intintType=cur.getInt(index_Type);
  55. SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");
  56. Dated=newDate(longDate);
  57. StringstrDate=dateFormat.format(d);
  58. StringstrType="";
  59. if(intType==1){
  60. strType="接收";
  61. }elseif(intType==2){
  62. strType="发送";
  63. }else{
  64. strType="null";
  65. }
  66. smsBuilder.append("[");
  67. smsBuilder.append(strAddress+",");
  68. smsBuilder.append(intPerson+",");
  69. smsBuilder.append(strbody+",");
  70. smsBuilder.append(strDate+",");
  71. smsBuilder.append(strType);
  72. smsBuilder.append("]\n\n");
  73. }while(cur.moveToNext());
  74. if(!cur.isClosed()){
  75. cur.close();
  76. cur=null;
  77. }
  78. }else{
  79. smsBuilder.append("noresult!");
  80. }//endif
  81. smsBuilder.append("getSmsInPhonehasexecuted!");
  82. }catch(SQLiteExceptionex){
  83. Log.d("SQLiteExceptioningetSmsInPhone",ex.getMessage());
  84. }
  85. returnsmsBuilder.toString();
  86. }
  87. }

AndroidManifest.xml 权限

记得在AndroidManifest.xml中加入android.permission.READ_SMS这个permission

<uses-permissionandroid:name="android.permission.READ_SMS"/>


运行结果:


代码示例



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 => 协议0SMS_RPOTO,1MMS_PROTO
  7. read => 是否阅读0未读,1已读
  8. status => 状态 -1接收,0complete,64pending,128failed
  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 协议,分为: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数据库表字段类型的源码:

[java] view plain copy print ?
  1. privatevoidcreateSmsTables(SQLiteDatabasedb){
  2. //N.B.:Wheneverthecolumnsherearechanged,thecolumnsin
  3. //{@refMmsSmsProvider}mustbechangedtomatch.
  4. db.execSQL("CREATETABLEsms("+
  5. "_idINTEGERPRIMARYKEY,"+
  6. "thread_idINTEGER,"+
  7. "addressTEXT,"+
  8. "personINTEGER,"+
  9. "dateINTEGER,"+
  10. "date_sentINTEGERDEFAULT0,"+
  11. "protocolINTEGER,"+
  12. "readINTEGERDEFAULT0,"+
  13. "statusINTEGERDEFAULT-1,"+//aTP-Statusvalue
  14. //or-1ifit
  15. //statushasn't
  16. //beenreceived
  17. "typeINTEGER,"+
  18. "reply_path_presentINTEGER,"+
  19. "subjectTEXT,"+
  20. "bodyTEXT,"+
  21. "service_centerTEXT,"+
  22. "lockedINTEGERDEFAULT0,"+
  23. "error_codeINTEGERDEFAULT0,"+
  24. "seenINTEGERDEFAULT0"+
  25. ");");
  26. ....
  27. }

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


联系人为空

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


更多相关文章

  1. android打电话发短信
  2. [APP] Android(安卓)开发笔记 006-使用短信验证SDK进行短信验证
  3. Android(安卓)初识Retrofit
  4. Android发送短信方法实例详解
  5. 怎么去掉联系人、通话记录、拨号列表界面中的电话号码中间的空格
  6. 【contacts】Phonebook电话本
  7. android 获取手机中的联系人
  8. 转:Android之通信录中的联系人操作
  9. Android(安卓)短信 彩信 wap push的接收

随机推荐

  1. ArcGIS API for Android(安卓)案例教程 2
  2. Bluetooth--- android -- 蓝牙 bluetooth
  3. Android应用程序请求SurfaceFlinger服务
  4. Android(安卓)工程目录结构介绍
  5. Android中的资源与国际化!
  6. 混淆Android(安卓)JAR包的方法
  7. Android开发常用网站汇总
  8. Android的Handler总结
  9. android ContentProvider使用详解
  10. android中的ellipsize