標籤:android基礎 android
簡訊的實體bean
package com.examp.backsms.domain;public class SmsInfo {private String address;private String date;private String type;private String body;public SmsInfo() {}public SmsInfo(String address, String date, String type, String body) {this.address = address;this.date = date;this.type = type;this.body = body;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getBody() {return body;}public void setBody(String body) {this.body = body;}@Overridepublic String toString() {return "SmsInfo [address=" + address + ", date=" + date + ", type="+ type + ", body=" + body + "]";}}
核心代碼
package com.examp.backsms;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.ContentResolver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.view.View;import com.examp.backsms.domain.SmsInfo;import com.examp.backsms.util.SmsUtils;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void backSms(View view) { // 建立被叫主機名稱 Uri uri = Uri.parse("content://sms/"); // 擷取內容解析器 ContentResolver resolver = getContentResolver(); // 執行查詢,得到結果集 Cursor cursor = resolver.query(uri, new String[] { "address", "date", "type", "body" }, null, null, null); //建立簡訊的集合 List<SmsInfo> infos = new ArrayList<SmsInfo>(); //逐一添加到集合 while (cursor.moveToNext()) { SmsInfo info = new SmsInfo(); info.setAddress(cursor.getString(cursor.getColumnIndex("address"))); info.setBody(cursor.getString(cursor.getColumnIndex("body"))); info.setDate(cursor.getString(cursor.getColumnIndex("date"))); info.setType(cursor.getString(cursor.getColumnIndex("type"))); infos.add(info); } //通過工具類調用備份的業務 //將集合|本活動的上下文傳入 SmsUtils.backupSms(infos, this); cursor.close(); }}
工具類
package com.examp.backsms.util;import java.io.File;import java.io.FileOutputStream;import java.util.List;import org.xmlpull.v1.XmlSerializer;import android.content.Context;import android.os.Environment;import android.util.Xml;import android.widget.Toast;import com.examp.backsms.domain.SmsInfo;public class SmsUtils {public static void backupSms(List<SmsInfo> smsInfos, Context context) {try {// 建立XML序列化器XmlSerializer serializer = Xml.newSerializer();File file = new File(Environment.getExternalStorageDirectory(),"backupSms.xml");FileOutputStream os = new FileOutputStream(file);// 初始化xml序列化器,指定xml資料寫入到那個檔案,並且制定檔案的編碼方式serializer.setOutput(os, "utf-8");// 設定<?xml version="1.0" encoding="utf-8"?>,及是否是獨立的xml檔案serializer.startDocument("utf-8", true);// 相當於<smss>serializer.startTag(null, "smss");for (SmsInfo info : smsInfos) {serializer.startTag(null, "sms");serializer.startTag(null, "body");serializer.text(info.getBody());serializer.endTag(null, "body");serializer.startTag(null, "type");serializer.text(info.getType() + "");serializer.endTag(null, "type");serializer.startTag(null, "address");serializer.text(info.getAddress());serializer.endTag(null, "address");serializer.startTag(null, "date");serializer.text(info.getDate() + "");serializer.endTag(null, "date");serializer.endTag(null, "sms");}serializer.endTag(null, "smss");serializer.endDocument();os.close();Toast.makeText(context,"備份簡訊成功,備份儲存路徑為:"+ Environment.getExternalStorageDirectory()+ "backSms.xml", Toast.LENGTH_SHORT).show();} catch (Exception e) {Toast.makeText(context, "備份簡訊息失敗!!", Toast.LENGTH_SHORT).show();e.printStackTrace();}}}
視圖代碼,由於只是一個案例,只有一個按鈕
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="backSms" android:text="@string/bt_queryAll" /></RelativeLayout>
許可權資訊清單檔
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.examp.backsms" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <!-- 擷取 讀寫簡訊的許可權 --> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <!-- 擷取寫入SD卡的許可權 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.examp.backsms.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
資源檔string.xml
<?xml version="1.0" encoding="utf-8"?><resources> <string name="app_name">0019簡訊備份</string> <string name="action_settings">Settings</string> <string name="bt_queryAll">備份簡訊</string></resources>
注:本代碼只是案例代碼,不能夠承受過大的資料壓力,所以實際開發的時候是邊讀資料邊備份.