歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 短信的備份與恢復(導入導出)

Android 短信的備份與恢復(導入導出)

日期:2017/3/1 11:11:27   编辑:Linux編程

最近在做一個Android 備份軟件,剛剛把短信的備份與恢復做完。短信的備份主要是對數據庫mmssms.db的sms表進行數據的導出,當然這裡是跨應用的,所以要使用contendResolver來訪問,最後把數據導出成xml文件。恢復時再對xml文件解析。備份時注意,不要備份thread_id字段,否則恢復時,手機中查看不到恢復的短信。

源代碼下載在Linux公社的1號FTP服務器裡,下載地址:

FTP地址:ftp://www.linuxidc.com

用戶名:www.linuxidc.com

密碼:www.muu.cc

在 2011年LinuxIDC.com\10月\10月\Android 短信的備份與恢復(導入導出)

下載方法見 http://www.linuxidc.net/thread-1187-1-1.html

短信導出源碼:

  1. package cn.sqk.sms;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.PrintWriter;
  6. import java.text.SimpleDateFormat;
  7. import java.util.Date;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. import org.xmlpull.v1.XmlSerializer;
  12. import cn.sqk.constants.SmsField;
  13. import android.content.ContentResolver;
  14. import android.content.Context;
  15. import android.database.Cursor;
  16. import android.database.sqlite.SQLiteException;
  17. import android.net.Uri;
  18. import android.os.Environment;
  19. import android.util.Log;
  20. import android.util.Xml;
  21. import android.widget.Toast;
  22. public class ExportSmsXml {
  23. Context context;
  24. public static final String SMS_URI_ALL = "content://sms/";
  25. private FileOutputStream outStream = null;
  26. private XmlSerializer serializer;
  27. public ExportSmsXml(Context context) {
  28. this.context = context;
  29. }
  30. public void xmlStart() {
  31. String path = Environment.getExternalStorageDirectory().getPath() + "/exportSms";
  32. File file = new File(path);
  33. if (!file.exists()) {
  34. file.mkdirs();
  35. }
  36. File file2 = new File(path, "message.xml");
  37. try {
  38. outStream = new FileOutputStream(file2);
  39. serializer = Xml.newSerializer();
  40. serializer.setOutput(outStream, "UTF-8");
  41. serializer.startDocument("UTF-8", true);
  42. serializer.startTag(null, "sms");
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. public boolean createXml() throws Exception {
  48. this.xmlStart();
  49. Cursor cursor = null;
  50. try {
  51. ContentResolver conResolver = context.getContentResolver();
  52. String[] projection = new String[] { SmsField.ADDRESS, SmsField.PERSON, SmsField.DATE, SmsField.PROTOCOL,
  53. SmsField.READ, SmsField.STATUS, SmsField.TYPE, SmsField.REPLY_PATH_PRESENT,
  54. SmsField.BODY,SmsField.LOCKED,SmsField.ERROR_CODE, SmsField.SEEN }; // type=1是收件箱,==2是發件箱;read=0表示未讀,read=1表示讀過,seen=0表示未讀,seen=1表示讀過
  55. Uri uri = Uri.parse(SMS_URI_ALL);
  56. cursor = conResolver.query(uri, projection, null, null, "_id asc");
  57. if (cursor.moveToFirst()) {
  58. // 查看數據庫sms表得知 subject和service_center始終是null所以這裡就不獲取它們的數據了。
  59. String address;
  60. String person;
  61. String date;
  62. String protocol;
  63. String read;
  64. String status;
  65. String type;
  66. String reply_path_present;
  67. String body;
  68. String locked;
  69. String error_code;
  70. String seen;
  71. do {
  72. // 如果address == null,xml文件中是不會生成該屬性的,為了保證解析時,屬性能夠根據索引一一對應,必須要保證所有的item標記的屬性數量和順序是一致的
  73. address = cursor.getString(cursor.getColumnIndex(SmsField.ADDRESS));
  74. if (address == null) {
  75. address = "";
  76. }
  77. person = cursor.getString(cursor.getColumnIndex(SmsField.PERSON));
  78. if (person == null) {
  79. person = "";
  80. }
  81. date = cursor.getString(cursor.getColumnIndex(SmsField.DATE));
  82. if (date == null) {
  83. date = "";
  84. }
  85. protocol = cursor.getString(cursor.getColumnIndex(SmsField.PROTOCOL));
  86. if (protocol == null) {// 為了便於xml解析
  87. protocol = "";
  88. }
  89. read = cursor.getString(cursor.getColumnIndex(SmsField.READ));
  90. if (read == null) {
  91. read = "";
  92. }
  93. status = cursor.getString(cursor.getColumnIndex(SmsField.STATUS));
  94. if (status == null) {
  95. status = "";
  96. }
  97. type = cursor.getString(cursor.getColumnIndex(SmsField.TYPE));
  98. if (type == null) {
  99. type = "";
  100. }
  101. reply_path_present = cursor.getString(cursor.getColumnIndex(SmsField.REPLY_PATH_PRESENT));
  102. if (reply_path_present == null) {// 為了便於XML解析
  103. reply_path_present = "";
  104. }
  105. body = cursor.getString(cursor.getColumnIndex(SmsField.BODY));
  106. if (body == null) {
  107. body = "";
  108. }
  109. locked = cursor.getString(cursor.getColumnIndex(SmsField.LOCKED));
  110. if (locked == null) {
  111. locked = "";
  112. }
  113. error_code = cursor.getString(cursor.getColumnIndex(SmsField.ERROR_CODE));
  114. if (error_code == null) {
  115. error_code = "";
  116. }
  117. seen = cursor.getString(cursor.getColumnIndex(SmsField.SEEN));
  118. if (seen == null) {
  119. seen = "";
  120. }
  121. // 生成xml子標記
  122. // 開始標記
  123. serializer.startTag(null, "item");
  124. // 加入屬性
  125. serializer.attribute(null, SmsField.ADDRESS, address);
  126. serializer.attribute(null, SmsField.PERSON, person);
  127. serializer.attribute(null, SmsField.DATE, date);
  128. serializer.attribute(null, SmsField.PROTOCOL, protocol);
  129. serializer.attribute(null, SmsField.READ, read);
  130. serializer.attribute(null, SmsField.STATUS, status);
  131. serializer.attribute(null, SmsField.TYPE, type);
  132. serializer.attribute(null, SmsField.REPLY_PATH_PRESENT, reply_path_present);
  133. serializer.attribute(null, SmsField.BODY, body);
  134. serializer.attribute(null, SmsField.LOCKED, locked);
  135. serializer.attribute(null, SmsField.ERROR_CODE, error_code);
  136. serializer.attribute(null, SmsField.SEEN, seen);
  137. // 結束標記
  138. serializer.endTag(null, "item");
  139. } while (cursor.moveToNext());
  140. } else {
  141. return false;
  142. }
  143. } catch (SQLiteException ex) {
  144. ex.printStackTrace();
  145. Log.d("SQLiteException:", ex.getMessage());
  146. }finally {
  147. if(cursor != null) {
  148. cursor.close();//手動關閉cursor,及時回收
  149. }
  150. }
  151. serializer.endTag(null, "sms");
  152. serializer.endDocument();
  153. outStream.flush();
  154. outStream.close();
  155. return true;
  156. }
  157. }
Copyright © Linux教程網 All Rights Reserved