Android编程之SMS读取短信并保存到SQLite

这篇文章主要介绍了Android编程之SMS读取短信并保存到SQLite的方法,涉及Android针对SMS短信及SQLite数据库的相关操作技巧,需要的朋友可以参考下

本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法。分享给大家供大家参考,具体如下:

Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制)

现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后读取SQLite数据库提取短信,并显示

SMS短信SQLite存取代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.homer.sms;
import java.sql.Date;
import java.text.SimpleDateFormat;
import org.loon.wsi.R;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TableRow.LayoutParams;
import android.widget.TextView;
/**
  * 读取手机短信, 先保存到SQLite数据,然后再读取数据库显示
  *
  * @author sunboy_2050
  * @date 2012.03.06
  */
public class smsRead4 extends Activity {
  TableLayout tableLayout;
  int index = 0 ;
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super .onCreate(savedInstanceState);
   setContentView(R.layout.main);
   tableLayout = (TableLayout) findViewById(R.id.tableLayout);
   showSMS();
  }
  private void showSMS() {
   SmsHander smsHander = new SmsHander( this );
   smsHander.createSMSDatabase(); // 创建SQLite数据库
   smsHander.insertSMSToDatabase(); // 读取手机短信,插入SQLite数据库
   Cursor cursor = smsHander.querySMSInDatabase( 100 ); // 获取前100条短信(日期排序)
   cursor.moveToPosition(- 1 );
   while (cursor.moveToNext()) {
    String strAddress = cursor.getString(cursor.getColumnIndex( "address" ));
    String strDate = cursor.getString(cursor.getColumnIndex( "date" ));
    String strBody = cursor.getString(cursor.getColumnIndex( "body" ));
    SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
    Date date = new Date(Long.parseLong(strDate));
    strDate = dateFormat.format(date);
    String smsTitle = strAddress + "\t\t" + strDate;
    String smsBody = strBody + "\n" ;
    Log.i( "tableRow" , smsTitle + smsBody);
    // title Row
    TableRow trTitle = new TableRow( this );
    trTitle.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    TextView tvTitle = new TextView( this );
    tvTitle.setText(smsTitle);
    tvTitle.getPaint().setFakeBoldText( true ); // 加粗字体
    tvTitle.setTextColor(Color.RED);
    tvTitle.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    trTitle.addView(tvTitle);
    tableLayout.addView(trTitle, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    // body Row
    TableRow trBody = new TableRow( this );
    trBody.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    TextView tvBody = new TextView( this );
    tvBody.setText(smsBody);
    tvBody.setLayoutParams( new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    trBody.addView(tvBody);
    tableLayout.addView(trBody, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
   }
   if (!cursor.isClosed()) {
    cursor.close();
    cursor = null ;
   }
   smsHander.closeSMSDatabase();
   index = 0 ;
  }
  public class SmsHander {
   SQLiteDatabase db;
   Context context;
   public SmsHander(Context context) {
    this .context = context;
   }
   public void createSMSDatabase() {
    String sql = "create table if not exists sms("
      + "_id integer primary key autoincrement,"
      + "address varchar(255)," + "person varchar(255),"
      + "body varchar(1024)," + "date varchar(255),"
      + "type integer)" ;
    db = SQLiteDatabase.openOrCreateDatabase(context.getFilesDir().toString() + "/data.db3" , null ); // 创建数据库
    db.execSQL(sql);
   }
   // 获取手机短信
   private Cursor getSMSInPhone() {
    Uri SMS_CONTENT = Uri.parse( "content://sms/" );
    String[] projection = new String[] { "_id" , "address" , "person" , "body" , "date" , "type" };
    Cursor cursor = context.getContentResolver().query(SMS_CONTENT, projection, null , null , "date desc" ); // 获取手机短信
    while (cursor.moveToNext()) {
     System.out.println( "--sms-- : " + cursor.getString(cursor.getColumnIndex( "body" )));
    }
    return cursor;
   }
   // 保存手机短信到 SQLite 数据库
   public void insertSMSToDatabase() {
    Long lastTime;
    Cursor dbCount = db.rawQuery( "select count(*) from sms" , null );
    dbCount.moveToFirst();
    if (dbCount.getInt( 0 ) > 0 ) {
     Cursor dbcur = db.rawQuery( "select * from sms order by date desc limit 1" , null );
     dbcur.moveToFirst();
     lastTime = Long.parseLong(dbcur.getString(dbcur.getColumnIndex( "date" )));
    } else {
     lastTime = new Long( 0 );
    }
    dbCount.close();
    dbCount = null ;
    Cursor cur = getSMSInPhone(); // 获取短信(游标)
    db.beginTransaction(); // 开始事务处理
    if (cur.moveToFirst()) {
     String address;
     String person;
     String body;
     String date;
     int type;
     int iAddress = cur.getColumnIndex( "address" );
     int iPerson = cur.getColumnIndex( "person" );
     int iBody = cur.getColumnIndex( "body" );
     int iDate = cur.getColumnIndex( "date" );
     int iType = cur.getColumnIndex( "type" );
     do {
      address = cur.getString(iAddress);
      person = cur.getString(iPerson);
      body = cur.getString(iBody);
      date = cur.getString(iDate);
      type = cur.getInt(iType);
      if (Long.parseLong(date) > lastTime) {
       String sql = "insert into sms values(null, ?, ?, ?, ?, ?)" ;
       Object[] bindArgs = new Object[] { address, person, body, date, type };
       db.execSQL(sql, bindArgs);
      } else {
       break ;
      }
     } while (cur.moveToNext());
     cur.close();
     cur = null ;
     db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
     db.endTransaction(); // 结束事务处理
    }
   }
   // 获取 SQLite 数据库中的全部短信
   public Cursor querySMSFromDatabase() {
    String sql = "select * from sms order by date desc" ;
    return db.rawQuery(sql, null );
   }
   // 获取 SQLite 数据库中的最新 size 条短信
   public Cursor querySMSInDatabase( int size) {
    String sql;
    Cursor dbCount = db.rawQuery( "select count(*) from sms" , null );
    dbCount.moveToFirst();
    if (size < dbCount.getInt( 0 )) { // 不足 size 条短信,则取前 size 条
     sql = "select * from sms order by date desc limit " + size;
    } else {
     sql = "select * from sms order by date desc" ;
    }
    dbCount.close();
    dbCount = null ;
    return db.rawQuery(sql, null );
   }
   // 获取 SQLite数据库的前 second秒短信
   public Cursor getSMSInDatabaseFrom( long second) {
    long time = System.currentTimeMillis() / 1000 - second;
    String sql = "select * from sms order by date desc where date > " + time;
    return db.rawQuery(sql, null );
   }
   // 关闭数据库
   public void closeSMSDatabase() {
    if (db != null && db.isOpen()) {
     db.close();
     db = null ;
    }
   }
  }
}

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值