我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面,
但我们这里的是读取到xml里面的。
首先我们就先在我们的高级工具里面新增两个条目啦,一个是短信备份,一个是短信恢复,就像下面的图一样,具体的那个类的代码我就不粘出来了,因为高级工具这个类挺长的
大家看也看得不爽,如果有什么不明白的,可以看看我们前面的内容
我们要备份短信,那么我们肯定就要先把短信的内容给读取出来啦,其实读取短信的内容也很简单,我们可以参考一下Android自己的短信管理器是怎样写的,然后我们照着写就行啦,那怎样拿到Android自己的短信管理器的源码呢,有两种方法,一种就是从Android的开源网站上下载,如果不会的可以看看我们的文章Android源码下载
还有和种方法就是拿到Android系统的apk然后反编译它,如果不会的话,可以看看我们的文章获取Android自己写好了的apk以及反编译
其实获取短信和获取系统的联系人都是差不多的,大家也可以参考一下我们之前写的那个获取手机联系人
也可以参考一下我们下面写的
首先我们新建一个Model类还有一个类是用来读取用户的短信内容
com.xiaobin.security.domain.SmsInfo
package com.xiaobin.security.domain; public class SmsInfo { private String id; private String address; private String date; private int type; private String 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 int getType() { return type; } public void setType(int type) { this.type = type; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
读取手机短信内容的类
package com.xiaobin.security.engine; import java.util.ArrayList; import java.util.List; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import com.xiaobin.security.domain.SmsInfo; public class SmsService { private Context context; public SmsService(Context context) { this.context = context; } public List<SmsInfo> getSmsInfo() { List<SmsInfo> infos = new ArrayList<SmsInfo>(); ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://sms/"); Cursor cursor = resolver.query(uri, new String[] {"_id", "address", "date", "type", "body"}, null, null, " date desc "); SmsInfo info; while(cursor.moveToNext()) { info = new SmsInfo(); String id = cursor.getString(0); String address = cursor.getString(1); String date = cursor.getString(2); int type = cursor.getInt(3); String body = cursor.getString(4); info.setId(id); info.setAddress(address); info.setDate(date); info.setType(type); info.setBody(body); infos.add(info); } cursor.close(); return infos; } }
拿到短信内容的类,我们也写好啦,那么现在我们就要来完善一下备份的过程啦
我们备份短信,有可能会要很久时间的,当用户的短信量特别大的时候,所以我们就不能在主界面里面操作啦,所以我们就开启一个服务,来进行短信的备份
com.xiaobin.security.service.BackupSmsService
package com.xiaobin.security.service; import java.io.File; import java.io.FileOutputStream; import java.util.List; import org.xmlpull.v1.XmlSerializer; import android.app.Service; import android.content.Intent; import android.os.Environment; import android.os.IBinder; import android.os.Looper; import android.util.Xml; import android.widget.Toast; import com.xiaobin.security.domain.SmsInfo; import com.xiaobin.security.engine.SmsService; public class BackupSmsService extends Service { SmsService smsService; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); smsService = new SmsService(this); new Thread() { public void run() { List<SmsInfo> infos = smsService.getSmsInfo(); File dir = new File(Environment.getExternalStorageDirectory(), "/security/backup"); if(!dir.exists()) { dir.mkdirs(); } File file = new File(Environment.getExternalStorageDirectory() + "/security/backup/smsbackup.xml"); //创建一个xml的序列化器 XmlSerializer xmlSerializer = Xml.newSerializer(); try { FileOutputStream fos = new FileOutputStream(file); //设置写xml的编码 xmlSerializer.setOutput(fos, "utf-8"); xmlSerializer.startDocument("utf-8", true); xmlSerializer.startTag(null, "smss"); for(SmsInfo info : infos) { xmlSerializer.startTag(null, "sms"); xmlSerializer.startTag(null, "id"); xmlSerializer.text(info.getId()); xmlSerializer.endTag(null, "id"); xmlSerializer.startTag(null, "address"); xmlSerializer.text(info.getAddress()); xmlSerializer.endTag(null, "address"); xmlSerializer.startTag(null, "date"); xmlSerializer.text(info.getDate()); xmlSerializer.endTag(null, "date"); xmlSerializer.startTag(null, "type"); xmlSerializer.text(info.getType() + ""); xmlSerializer.endTag(null, "type"); xmlSerializer.startTag(null, "body"); xmlSerializer.text(info.getBody()); xmlSerializer.endTag(null, "body"); xmlSerializer.endTag(null, "sms"); } xmlSerializer.endTag(null, "smss"); xmlSerializer.endDocument(); fos.flush(); fos.close(); //在子线程里面是不能弹出一个Toast的,因为子线程里面没有Looper, //但我们通过下面几个步骤就可以在子线程里面弹出Toast了 Looper.prepare();//创建一个Looper Toast.makeText(getApplicationContext(), "备份成功", Toast.LENGTH_SHORT).show(); Looper.loop();//轮循一次Looper } catch (Exception e) { Looper.prepare();//创建一个Looper Toast.makeText(getApplicationContext(), "备份失败", Toast.LENGTH_SHORT).show(); Looper.loop();//轮循一次Looper e.printStackTrace(); } } }.start(); } }
就这样,我们的备份的服务也写好啦,先在AndroidManifest文件里面注册一下它,然后再把短信操作的权限给加上
<service android:name="com.xiaobin.security.service.BackupSmsService"></service>
<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/>
然后我们再回到com.xiaobin.security.ui.AToolActivity这个类里面啦,给备份的那个条目注册一个点击事件,然后一点击就开启备份的服务
case R.id.tv_atool_sms_backup : Intent backupIntent = new Intent(this, BackupSmsService.class); startService(backupIntent); break;
好啦,到现在为止,短信备份就差不多完成的啦,我们下一次说一下我们短信的恢复