Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> 系統備份 >> Android簡易實戰教程--第十三話《短信備份和還原~三》

Android簡易實戰教程--第十三話《短信備份和還原~三》

編輯:系統備份

之前寫過短信備份的小案例,哪裡僅僅是虛擬了幾條短信信息。本篇封裝一個業務類,且直接通過內容提供者,訪問本系統的短信信息,再提供對外接口。如果想要短信備份和短信還原,直接復制這段代碼即可。對於您調用這個類,備份短信或者還原短信的時候,別忘了聲明短信可讀可寫的權限就好了。封裝的代碼如下:

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();
		}
	}
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved