博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
备份与还原短信的方法实现
阅读量:5159 次
发布时间:2019-06-13

本文共 9094 字,大约阅读时间需要 30 分钟。

首先实现备份与短信的还原需要记得添加权限:

 短信备份/还原工具类

 

package com.loaderman.sms.utils;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.SystemClock;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.lang.reflect.Type;import java.util.ArrayList;/** * 短信备份/还原工具类 */public class SmsUtils {    //短信备份    public static void smsBackup(Context ctx, File file, OnSmsCallback callback) throws Exception {        //1. 读取系统的短信数据库: dta/data/android.provider.telephony/databases/mmssms.db        //
//
Cursor cursor = ctx.getContentResolver().query(Uri.parse("content://sms"), new String[]{"date", "read", "type", "body", "address"}, null, null, null); //备份进度 = 当前备份条数*100/短信总个数 int totalCount = cursor.getCount();//返回当前记录的总个数 //修改进度条最大值为短信总数 //dialog.setMax(totalCount); //将短信总数回调给上个页面 callback.onGetTotalCount(totalCount); ArrayList
list = new ArrayList<>(); if (cursor != null) { int progress = 0;//当前备份条数 while (cursor.moveToNext()) { SmsInfo info = new SmsInfo(); info.address = cursor.getString(cursor.getColumnIndex("address"));//短信号码 info.date = cursor.getString(cursor.getColumnIndex("date"));//短信时间 info.read = cursor.getString(cursor.getColumnIndex("read"));//已读未读, 0表示未读,1表示已读 info.type = cursor.getString(cursor.getColumnIndex("type"));//短信类型, 1表示接收, 2表示发送 info.body = cursor.getString(cursor.getColumnIndex("body"));//短信内容 list.add(info); progress++; //int percent = progress * 100 / totalCount; //更新进度条 //dialog.setProgress(progress); //将短信进度回调给上一个页面 callback.onProgress(progress); SystemClock.sleep(500);//模拟耗时 } } // System.out.println(list); //2. 将短信内容保存在本地, sdcard, 数据库, sp, file //放在本地文件中: xxx.backup-->序列化(就是将对象转为可见的字符串), 格式, xml, json //json: [{address:110, date:11231232}, {},{}] //Gson: google json-->将对象序列化为json或将json反序列化为对象 Gson gson = new Gson(); String json = gson.toJson(list); //System.out.println("json:" + json); FileOutputStream out = new FileOutputStream(file); out.write(json.getBytes()); out.flush(); out.close(); } //短信还原 public static void smsRestore(Context ctx, File file, OnSmsCallback callback) throws Exception { //1. 从本地文件中读取短信,反序列化为对象集合 Gson gson = new Gson(); //初始化类型, 当集合中还有对象时需要通过此种方式来反序列化 Type type = new TypeToken
>() { }.getType(); //读取文件流, 反序列化为集合 ArrayList
list = gson.fromJson(new FileReader(file), type); callback.onGetTotalCount(list.size()); System.out.println("短信还原:" + list); //2. 遍历集合, 插入短信数据库 ContentResolver resolver = ctx.getContentResolver(); int progress = 0; for (SmsInfo info : list) { //插入短信之前,必须判断短信是否存在 Cursor cursor = resolver.query(Uri.parse("content://sms"), null, "address=? and " + "date=?" + " and body=? and" + " type=? and read=?", new String[]{info.address, info.date, info.body, info .type, info.read}, null); if (cursor != null) { if (cursor.moveToNext()) { //短信存在, 不需要插入 //return ? break? continue? continue;//循环继续 } cursor.close(); } ContentValues values = new ContentValues(); values.put("address", info.address); values.put("date", info.date); values.put("body", info.body); values.put("type", info.type); values.put("read", info.read); resolver.insert(Uri.parse("content://sms"), values); progress++; callback.onProgress(progress); SystemClock.sleep(500); } } public static class SmsInfo { public String address; public String date; public String read; public String type; public String body; @Override public String toString() { return "SmsInfo{" + "address='" + address + '\'' + ", body='" + body + '\'' + '}'; } } //声明一个回调接口 public interface OnSmsCallback { //1. 获取短信的总数 void onGetTotalCount(int totalCount); //2. 获取当前备份进度 void onProgress(int progress); }}

 

 备份短信的方法:

private void smsBackup() {        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            Toast.makeText(this, "没有找到sdcard!", Toast.LENGTH_SHORT).show();            return;        }        //显示备份进度条        final ProgressDialog dialog = new ProgressDialog(this);        dialog.setTitle("正在备份,请稍候...");        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        dialog.show();        new Thread() {            @Override            public void run() {                // SmsCallbackImpl impl = new SmsCallbackImpl();//                impl.onProgress(10);//                impl.onGetTotalCount(13);                //回调-->对象的引用传递到底层, 由底层其他类调用当前对象的方法                //短信备份                try {                    SmsUtils.smsBackup(getApplicationContext(), new File(Environment                            .getExternalStorageDirectory()                            .getAbsolutePath() + "/sms11.backup"), new SmsUtils.OnSmsCallback() {                        @Override                        public void onGetTotalCount(int totalCount) {                            System.out.println("获取短信总数啦:" + totalCount);                            dialog.setMax(totalCount);                            progressBar.setMax(totalCount);                        }                        @Override                        public void onProgress(int progress) {                            System.out.println("获取短信进度啦:" + progress);                            dialog.setProgress(progress);                            progressBar.setProgress(progress);                        }                    });                } catch (Exception e) {                    e.printStackTrace();                    //备份失败                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            Toast.makeText(CommonToolActivity.this, "备份失败!", Toast.LENGTH_SHORT)                                    .show();                        }                    });                }                dialog.dismiss();            }        }.start();    }

 还原短信的方法

private void smsRestore() {        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {            Toast.makeText(this, "没有找到sdcard!", Toast.LENGTH_SHORT).show();            return;        }        //显示还原进度条        final ProgressDialog dialog = new ProgressDialog(this);        dialog.setTitle("正在还原,请稍候...");        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        dialog.show();        new Thread() {            @Override            public void run() {                try {                    SmsUtils.smsRestore(getApplicationContext(), new File(Environment                            .getExternalStorageDirectory()                            .getAbsolutePath() + "/sms11.backup"), new SmsUtils.OnSmsCallback() {                        @Override                        public void onGetTotalCount(int totalCount) {                            dialog.setMax(totalCount);                        }                        @Override                        public void onProgress(int progress) {                            dialog.setProgress(progress);                        }                    });                } catch (Exception e) {                    e.printStackTrace();                    //还原失败                    runOnUiThread(new Runnable() {                        @Override                        public void run() {                            Toast.makeText(CommonToolActivity.this, "还原失败!", Toast.LENGTH_SHORT)                                    .show();                        }                    });                }                dialog.dismiss();            }        }.start();    }    //实现回调接口//    class SmsCallbackImpl implements SmsUtils.OnSmsCallback {////        @Override//        public void onGetTotalCount(int totalCount) {//            System.out.println("获取短信总数啦:" + totalCount);//        }////        @Override//        public void onProgress(int progress) {//            System.out.println("获取短信进度啦:" + progress);//        }//    }}

 

转载于:https://www.cnblogs.com/loaderman/p/6508227.html

你可能感兴趣的文章
BZOJ.4145.[AMPPZ2014]The Prices(状压DP)
查看>>
软件工程 个人阅读作业2
查看>>
NodeJS学习(一):Assert模块
查看>>
Mysql MHA高可用集群架构
查看>>
金明的预算方案
查看>>
美团在Redis上踩过的一些坑-目录(本人非美团)(转)
查看>>
Lintcode: Longest Common Substring
查看>>
Groovy 学习手册(2)
查看>>
操作系统文件操作
查看>>
洛谷 P1724 东风谷早苗
查看>>
AngularJs中directive的延迟加载
查看>>
匀速运动(速度不整除的方法)
查看>>
判断是否是pc
查看>>
JGUI源码:响应式布局简单实现(13)
查看>>
Django中间件登录后可以阅读查看
查看>>
C# 网络编程之基于SMTP发送电子邮件
查看>>
Ef Core增加Sql方法
查看>>
TCP/IP协议
查看>>
java 几种常见的定时器
查看>>
WIN10 计算器 计算 表数范围小的可以向表数范围大 数据丢失
查看>>