备份与还原短信的方法实现
首先实现备份与短信的还原需要记得添加权限:
<uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/>
短信备份/还原工具类
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
//<uses-permission android:name="android.permission.READ_SMS"/>
//<uses-permission android:name="android.permission.WRITE_SMS"/>
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<SmsInfo> 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<ArrayList<SmsInfo>>() {
}.getType();
//读取文件流, 反序列化为集合
ArrayList<SmsInfo> 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);
// }
// }
}
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!
浙公网安备 33010602011771号