編輯:系統備份
之前寫過短信備份的小案例,哪裡僅僅是虛擬了幾條短信信息。本篇封裝一個業務類,且直接通過內容提供者,訪問本系統的短信信息,再提供對外接口。如果想要短信備份和短信還原,直接復制這段代碼即可。對於您調用這個類,備份短信或者還原短信的時候,別忘了聲明短信可讀可寫的權限就好了。封裝的代碼如下:
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();
}
}
}
微信備份通訊錄在哪 微信怎麼備份通訊錄
基於手機通訊錄的微信,自然有一個功能來保持通訊錄,那麼微信備份通訊錄在哪?微信怎麼備份通訊錄?本文來簡單進行幾個步驟,解決這兩個問題。一、打開微信,點擊最下
聯想樂檬K3備份數據方法都有哪些
聯想樂檬K3手機很是不錯,這手機支持的功能也是比較多的,那麼這手機的要如何去備份數據呢?接下來就一起來看看這詳細介
efs是什麼意思及efs備份使用教程
很多朋友不知道efs是什麼意思,efs是加密文件系統,很多用戶說按照官方教程刷機完以後手機沒有信號,這就是efs信息丟失導致的,所以說這個文件非常重要,刷機前必須要備份,
安卓手機如何備份數據
在用電腦的時候,我們經常備份電腦裡面的重要數據,以免電腦出現問題丟失數據;在用手機時也要養成經常備份的習慣,以免手機出現意外時手機內的重要數據丟失。 步