之前写过短信备份的小案例,哪里仅仅是虚拟了几条短信信息。本篇封装一个业务类,且直接通过内容提供者,访问本系统的短信信息,再提供对外接口。如果想要短信备份和短信还原,直接复制这段代码即可。对于您调用这个类,备份短信或者还原短信的时候,别忘了声明短信可读可写的权限就好了。封装的代码如下:

package com.itydl.mobileguard.engine;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter; import org.json.JSONArray;
import org.json.JSONObject; import com.itheima62.mobileguard.utils.EncryptTools;
import com.itheima62.mobileguard.utils.JsonStrTools;
import com.itheima62.mobileguard.utils.MyConstants; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
import android.view.View;
import android.widget.ProgressBar; /**
* 短信备份和还原的业务类封装
*
* @author Administrator
*
*/
public class SmsEngine { public interface BaikeProgress {
/**
* 进度的显示回调
*/
void show(); /**
* @param max
* 回调显示进度的最大值
*/
void setMax(int max); /**
* 回调显示当前进度
*
* @param progress
*/
void setProgress(int progress); /**
* 进度完成的回调
*/
void end();
} private static class Data {
int progress;
} /**
* 通过子线程来做短信的还原json格式
*
* @param context
* @param pd
* 通过接口回调备份的数据(所有回调方法都在主线程中执行)
*/
public static void smsResumnJson(final Activity context,
final BaikeProgress pd) {
final Data data = new Data();
new Thread() {
@Override
public void run() {
// 1,通过内容提供者保存短信
Uri uri = Uri.parse("content://sms"); // 2,获取备份的短信
try {
FileInputStream fis = new FileInputStream(new File(
Environment.getExternalStorageDirectory(),
"sms.json"));
// json数据的合并
StringBuilder jsonSmsStr = new StringBuilder();
// io流的封装 把字节流封装成缓冲的字符流
BufferedReader reader = new BufferedReader(
new InputStreamReader(fis)); String line = reader.readLine();
while (line != null) {
jsonSmsStr.append(line);
line = reader.readLine();
} // 解析json数据
JSONObject jsonObj = new JSONObject(jsonSmsStr.toString());
//短信的个数
final int counts = Integer.parseInt(jsonObj.getString("count"));
System.out.println(); //设置回调结果的 show和 setMax方法
context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.show();
pd.setMax(counts);// 设置进度条总进度 }
}); //循环读取短信
JSONArray jarray = (JSONArray) jsonObj.get("smses");
for (int i = 0; i < counts ;i++) {
data.progress = i;
//获取一条短信
JSONObject smsjson = jarray.getJSONObject(i); ContentValues values = new ContentValues();
values.put("address", smsjson.getString("address"));
values.put("body", EncryptTools.decryption( smsjson.getString("body")));
values.put("date", smsjson.getString("date"));
values.put("type", smsjson.getString("type")); //往短信数据中加一条记录
context.getContentResolver().insert(uri, values); //回调结果当前进度
context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.setProgress(data.progress);
}
});
}
reader.close();// 关闭io流 //回调备份完成的结果
context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.end();
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start(); } /**
*
*/
/**
* 通过子线程来做短信的备份
*
* @param context
* @param pd
* 通过接口回调备份的数据(所有回调方法都在主线程中执行)
*/
public static void smsBaikeJson(final Activity context,
final BaikeProgress pd) {
new Thread() {
@Override
public void run() {
// 1,通过内容提供者获取到短信
Uri uri = Uri.parse("content://sms");
// 获取电话记录的联系人游标
final Cursor cursor = context.getContentResolver().query(uri,
new String[] { "address", "date", "body", "type" },
null, null, " _id desc"); // 2,写到文件中
File file = new File(Environment.getExternalStorageDirectory(),
"sms.json"); try {
FileOutputStream fos = new FileOutputStream(file); PrintWriter out = new PrintWriter(fos);
context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.show();
pd.setMax(cursor.getCount());// 设置进度条总进度 }
}); final Data data = new Data(); // 写根标记 {"count":"10"
out.println("{\"count\":\"" + cursor.getCount() + "\"");
// ,"smses":[
out.println(",\"smses\":[");
while (cursor.moveToNext()) {
data.progress++;
SystemClock.sleep(100);
// 取短信
if (cursor.getPosition() == 0) {
out.println("{");
} else {
out.println(",{");
} // address 封装 "address":"hello"
out.println("\"address\":\"" + cursor.getString(0)
+ "\",");
// date 封装
out.println("\"date\":\"" + cursor.getString(1) + "\",");
// body 封装
//对短信加密处理
String mbody = EncryptTools.encrypt(JsonStrTools.changeStr(cursor.getString(2))) ;
out.println("\"body\":\"" + mbody + "\",");
// type 封装
out.println("\"type\":\"" + cursor.getString(3) + "\""); out.println("}");
// 封装成xml标记 context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.setProgress(data.progress);
}
}); } context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.end();
}
});
// 写根标记结束标记
out.println("]}"); out.flush();
out.close();// 关闭流
cursor.close();// 关闭游标
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start(); } /**
* 短信的备份
*/
public static void smsBaikeXml(Activity context, final BaikeProgress pd) {
// 1,通过内容提供者获取到短信
Uri uri = Uri.parse("content://sms");
// 获取电话记录的联系人游标
final Cursor cursor = context.getContentResolver().query(uri,
new String[] { "address", "date", "body", "type" }, null, null,
" _id desc"); // 2,写到文件中
File file = new File(Environment.getExternalStorageDirectory(),
"sms.xml"); try {
FileOutputStream fos = new FileOutputStream(file); PrintWriter out = new PrintWriter(fos);
context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.show();
pd.setMax(cursor.getCount());// 设置进度条总进度 }
}); final Data data = new Data(); // 写根标记
out.println("<smses count='" + cursor.getCount() + "'>");
while (cursor.moveToNext()) {
data.progress++;
SystemClock.sleep(100);
// 取短信
out.println("<sms>"); // address 封装
out.println("<address>" + cursor.getString(0) + "</address>");
// date 封装
out.println("<date>" + cursor.getString(1) + "</date>");
// body 封装
out.println("<body>" + cursor.getString(2) + "</body>");
// type 封装
out.println("<type>" + cursor.getString(3) + "</type>"); out.println("</sms>");
// 封装成xml标记 context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.setProgress(data.progress);
}
}); } context.runOnUiThread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
pd.end();
}
});
// 写根标记结束标记
out.println("</smses>"); out.flush();
out.close();// 关闭流
cursor.close();// 关闭游标
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Android简易实战教程--第十三话《短信备份和还原~三》的更多相关文章

  1. Android简易实战教程--第二十三话《绚丽的菜单项》

    转载本博客请注明出处:点击打开链接  http://blog.csdn.net/qq_32059827/article/details/52327456 今天这篇稍微增强点代码量,可能要多花上5分钟喽 ...

  2. Android简易实战教程--第八话《短信备份~一》

    各种手机助手里面都包含了短信备份这一项.短信的本分主要包含四项:内容body.事件date.方式type.号码address. 短信备份~一.使用一种很笨的方式来保存短信到xml文件中,而且保存在外部 ...

  3. Android简易实战教程--第四话《最简单的短信发送器》

    首先配置一个布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmln ...

  4. Android简易实战教程--第十七话《自定义彩色环形进度条》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203533   点击打开链接 在Android初级教程里面,介绍了shape用法 ...

  5. Android简易实战教程--第二十七话《自定义View入门案例之开关按钮详细分析》

    转载此博客请注明出处点击打开链接       http://blog.csdn.net/qq_32059827/article/details/52444145 对于自定义view,可能是一个比较大的 ...

  6. Android简易实战教程--第二十话《通过广播接收者,对拨打电话外加ip号》

    没睡着觉,起来更篇文章吧哈哈!首先祝贺李宗伟击败我丹,虽然我是支持我丹的,但是他也不容易哈哈,值得尊敬的人!切入正题:这一篇来介绍个自定义广播接收者. 通常我们在外拨电话的时候,一般为使用网络电话.如 ...

  7. Android简易实战教程--第十话《模仿腾讯手机助手小火箭发射详解》

    之前对系统自带的土司的源码做了简要分析,见博客:点击打开链接 这一篇给一个小案例,自定义土司,模拟腾讯卫士的小火箭发射.如果想要迅速看懂代码,建议先去看一下上篇介绍点击打开链接 首先,定义一个服务,在 ...

  8. Android简易实战教程--第七话《在内存中存储用户名和密码》

    首先是配置文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  9. Android简易实战教程--第六话《开发一键锁屏应用2·完成》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...

随机推荐

  1. 洛谷mNOIP模拟赛Day2-将军令

    题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人 ...

  2. POJ 1324(BFS + 状态压缩)

    题意:给你一条蛇,要求一以最少的步数走到1,1 思路: 最开始一直没想到应该怎样保存状态,后来发现别人用二进制保存蛇的状态,即每两个节点之间的方向和头节点,二进制最多14位(感觉状态保存都能扯到二进制 ...

  3. 基于SSM框架实现简单的登录注册

    一.环境配置 工程目录 在pom.xml添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...

  4. Automap sqlalchemy.ext.automap 自动映射数据库表结构

    from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import Session from sqlalchemy i ...

  5. 数据结构之Trie树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  6. 64. Minimum Path Sum(中等, 又做出一个DP题, 你们非问我开不开心,当然开心喽!^^)

    Given an m x n grid filled with nonnegative numbers, find a path from top left to bottom right which ...

  7. SUSE10的虚拟机安装以及ORACLE 11g的安装

    SUSE10虚拟机安装与ORACLE安装 作者:张欣橙 本文所需要的所有参数均位于文末附录中 一.SUSE10虚拟机的安装与创建 新建虚拟机安装 选择下一步 选择下一步 选择下一步 选择下一步 选择下 ...

  8. swing JTable 更新数据

    rowData 是将要更新的表格内数据,coloumnName是将要更新的表头数据. table是原本的table对象,更新数据的时候要用 DefaultTableModel 类~ /*更新table ...

  9. IDEA中Git的使用

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...

  10. Nginx之(一)Nginx是什么

    Nginx("engine x")是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大 ...