短信的实体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; } @Override public 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>
注:本代码只是事例代码,不能够承受过大的数据压力,所以实际开发的时候是边读数据边备份.