短信备份与还原工具类

短信备份与还原工具类

package com.flyou.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.R.integer;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;

public class SmsUtils {
  private static final String TAG = "SmsUtils";
  private static ContentResolver resolver;
  private static Uri url;
  private static ContentValues values;
  private static ProgressDialog dialog;
  private static int max;
  private static int size;

  public interface BackUpCallBack {
    /**
     * 开始备份的时候,设置进度的最大值
     *
     * @param max
     *          总进度
     */
    public void beforeBackup(int max);

    /**
     * 备份过程中,增加进度
     *
     * @param progress
     *          当前进度
     */
    public void onSmsBackup(int progress);

  }

  public interface ReStroeCallBack {
    /**
     * 恢复短信前
     *
     * @param max
     *          最大短信条数
     */
    public void beforeReStore(int max);

    /**
     * 恢复短息时
     *
     * @param position
     *          当前进度
     */
    public void OnReStore(int position);

  }

  /**
   *
   * @param context
   *          上下文
   * @throws Exception
   *           把异常抛出给调用处处理
   */
  public static void buckUpSms(Context context, BackUpCallBack callBack) throws Exception {

    resolver = context.getContentResolver();
    File file = new File(Environment.getExternalStorageDirectory(), "backUpSms.xml");
    FileOutputStream fos = new FileOutputStream(file);
    XmlSerializer serializer = Xml.newSerializer();
    serializer.setOutput(fos, "utf-8");
    serializer.startDocument("utf-8", true);
    serializer.startTag(null, "smss");
    url = Uri.parse("content://sms/");
    Cursor cursor = resolver.query(url, new String[] { "address", "date", "type", "body" }, null, null, null);
    // 操作前
    callBack.beforeBackup(cursor.getCount());
    int postion = 0;

    // 遍历cursor 序列化 短信实体
    serializer.attribute(null, "size", cursor.getCount() + "");
    while (cursor.moveToNext()) {
      Thread.sleep(300);
      String address = cursor.getString(0);
      String date = cursor.getString(1);
      String type = cursor.getString(2);
      String body = cursor.getString(3);

      serializer.startTag(null, "sms");

      serializer.startTag(null, "address");
      serializer.text(address);
      serializer.endTag(null, "address");

      serializer.startTag(null, "date");
      serializer.text(date);
      serializer.endTag(null, "date");

      serializer.startTag(null, "type");
      serializer.text(type);
      serializer.endTag(null, "type");

      serializer.startTag(null, "body");
      serializer.text(body);
      serializer.endTag(null, "body");

      serializer.endTag(null, "sms");
      // 更新进度条
      callBack.onSmsBackup(postion++);
    }
    cursor.close();
    serializer.endTag(null, "smss");
    serializer.endDocument();
    fos.close();
  }

  /**
   * 短信的还原
   */
  public static void reStoreSms(Context context, ReStroeCallBack callBack) throws Exception {
    resolver = context.getContentResolver();

    // 删除原有短信数据
    Cursor cursor = resolver.query(url, new String[] { "address", "date", "type", "body" }, null, null, null);
    if (cursor.moveToNext()) {
      resolver.delete(url, null, null);
    }
    cursor.close();

    // 获取短信备份文件
    File file = new File(Environment.getExternalStorageDirectory(), "backUpSms.xml");
    InputStream inputStream = new FileInputStream(file);
    // 创建解析对象
    XmlPullParser parser = Xml.newPullParser();
    parser.setInput(inputStream, "utf-8");

    int eventType = parser.getEventType();

    while (eventType != XmlPullParser.END_DOCUMENT) {
      String tagName = parser.getName();
      switch (eventType) {
        case XmlPullParser.START_TAG:
          if ("smss".equals(tagName)) {

            max = Integer.parseInt(parser.getAttributeValue(null, "size"));
            Log.i(TAG, max + "-----------------------");
            // 备份前 设置最大进度条值
            callBack.beforeReStore(max);

            size = Integer.parseInt(parser.getAttributeValue(null, "size"));
          } else if ("sms".equals(tagName)) {
            values = new ContentValues();
          } else if ("address".equals(tagName)) {
            values.put("address", parser.nextText());
          } else if ("date".equals(tagName)) {
            values.put("date", parser.nextText());

          } else if ("type".equals(tagName)) {
            values.put("type", parser.nextText());

          } else if ("body".equals(tagName)) {
            values.put("body", parser.nextText());

          }
          break;
        case XmlPullParser.END_TAG:
          // 插入短信数据
          if ("sms".equals(tagName)) {
            Log.i(TAG, "----------------插入数据---------------");
            resolver.insert(url, values);

            callBack.OnReStore(size - (max--));
            Thread.sleep(300);
          }
          break;
        default:
          break;

      }
      // 获得下一个标签名
      eventType = parser.next();
    }

  }
}
时间: 2024-12-16 12:39:37

短信备份与还原工具类的相关文章

手机卫士07_自定义吐司_桌面小火箭_短信备份_接口和回调_应用程序信息,

1,自定义吐司显示风格 ①创建一个布局文件(代码注册的View看不出效果,所以还是定义布局文件比较好) 这里的背景是.9图片会根据包裹内容来拉伸 ②在显示自定义吐司的界面,显示的吐司通过View.inflate()创建 ③在设置中心增加一条修改归属地显示风格. {"半透明","活力橙","卫士蓝","金属灰","苹果绿"}; 点击之后弹出一个单选对话框. builder.setSingleChoiceIte

短信备份(原)

昨天在学习回调的时候,发现了其独特的魅力之处,它将业务代码逻辑和我们的工具类耦合性大大降低了. 应用场景:在实际开发中,经常会随着用户的需求的改变而对对话框的样式进行相应修改,在短信的备份过程中,往往需要给用户显示一个对话框,以提示用户进度. 常见的回调的步骤分为4步: //1,定义一个接口 //2,定义业务逻辑的抽象2个方法 //3,传递一个实现了第一步接口的实现类的对象进来(实现了未实现的抽象方法(将抽象的逻辑具体话)) //4,在合适的地方去调用实现类对象中,已经实现好的方法 代码如下:

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

各种手机助手里面都包含了短信备份这一项.短信的本分主要包含四项:内容body.事件date.方式type.号码address. 短信备份~一.使用一种很笨的方式来保存短信到xml文件中,而且保存在外部存储.后续会有:短信备份~二(xml序列化器):短信备份~三(内容提供者获取短信xml备份):短信备份~四(json方式备份数据库短信).备份的方式越来越高效,比较不同存储方式. 很显然,初次介绍短信备份,以一种简单笨拙的方式,且不涉及内容提供者,虚拟10条短信. 短信的保存,要以对象的形式保存.因

黑马程序员金山卫士实战短信备份2集

黑马程序员 大师班 安卓项目实战-分分钟搞定 金山卫士实战短信备份2集 有很多用户们在使用智能手机的过程中有及时清理手机,删除电话记录以及短信的习惯,以此来保证手机的纯净,但是有时我们会有一些重要的信息想要保存下来,这时该怎么办呢?备份就是一个很好的办法... 课程包含 短信备份.代码优化 下载地址:http://www.feixueteam.net/thread-947-1-1.html

Android开发短信备份小例子

主要是使用内容提供者ContentProvider #1.在activity_main.xml布局文件中添加写sdcard权限,并添加读短信的权限 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_par

Android开发遇到短信备份失败

今天做了一个有关ContentProvider的短信备份的小案例,遇到短信备份失败,费了一番周折后终于找到了问题所在 该案例是将短信写到一个xml文件然后保存在手机存储中实现短信的备份功能,关键实现代码如下 public class SmsUtils { public static void backUpSms(List<SmsInfo> smsInfos, Context context) { try { XmlSerializer serializer = Xml.newSerialize

【android基础篇】利用内容提供者实现短信备份

I,准备工作 系统存储短信内容的目录为:/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们找到对应的数据库文件. 我们可以发现该文件对于第三方而言,是不可读不可写的,这里则必须要使用内容提供者. 问题就来了:我不知道主机名,也就无法作为中间人去找证监会打探消息.其实,完全没有关系,我们可以翻阅安卓的源代码: \packages\providers\TelephonyProvider的清单文件,因为主机名都配置在清单文

mysql逻辑备份与还原工具mysqldump

(一)mysqldump介绍 mysqldump是MySQL自带的逻辑备份工具,类似于Oracle的expdp/impdp,mysqldump备份十分灵活,可以在以下级别对数据库进行备份: 实例下的所有数据库 某个或某几个数据库 某个数据库中的表 某个数据库中的表的某些记录 mysqldump的备份结果集有两种文件:一种是将数据转换为标准的SQL语句,另一种是按照指定的分隔符,输出为特定格式的平面文件. (二)mysqldump的用法 可以直接使用mysqldump命令查看mysqldump的用

短网址生成和还原工具使用教程

功能简介:这款工具支持一键生成新浪(t.cn).腾讯(url.cn).微信(w.url.cn)等各种短网址,同时会生成短链接二维码(可直接下载保存).生成的结果可用于社交媒体.个人签名.网络营销.线下推广等其他场合.另外,工具还提供了通过短网址反查原URL的功能.可将我们输入的短网址还原成真实的网址,支持还原t.cn.url.cn.dwz.cn等国内外300多种短网址. 工具地址:https://shorturl.iiilab.com/ 使用方法: 1. 首先介绍如何生成短网址.在浏览器中打开上