Android SMS(二)—— 读取短信保存到 SQLite

2024-01-14 18:58

本文主要是介绍Android SMS(二)—— 读取短信保存到 SQLite,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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


SMS短信SQLite存取代码:

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 * @since http://blog.csdn.net/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; } } } } 运行结果:


代码示例


推荐参考:

Android 之 SMS 短信读取


这篇关于Android SMS(二)—— 读取短信保存到 SQLite的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/606187

相关文章

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android我的二维码扫描功能发展史(完整)

最近在研究下二维码扫描功能,跟据从网上查阅的资料到自己勉强已实现扫描功能来一一介绍我的二维码扫描功能实现的发展历程: 首页通过网络搜索发现做android二维码扫描功能看去都是基于google的ZXing项目开发。 2、搜索怎么使用ZXing实现自己的二维码扫描:从网上下载ZXing-2.2.zip以及core-2.2-source.jar文件,分别解压两个文件。然后把.jar解压出来的整个c

android 带与不带logo的二维码生成

该代码基于ZXing项目,这个网上能下载得到。 定义的控件以及属性: public static final int SCAN_CODE = 1;private ImageView iv;private EditText et;private Button qr_btn,add_logo;private Bitmap logo,bitmap,bmp; //logo图标private st

Android多线程下载见解

通过for循环开启N个线程,这是多线程,但每次循环都new一个线程肯定很耗内存的。那可以改用线程池来。 就以我个人对多线程下载的理解是开启一个线程后: 1.通过HttpUrlConnection对象获取要下载文件的总长度 2.通过RandomAccessFile流对象在本地创建一个跟远程文件长度一样大小的空文件。 3.通过文件总长度/线程个数=得到每个线程大概要下载的量(线程块大小)。

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的