Android项目:手机安全卫士(14)—— 短信备份
1 概述
哈哈,今天又是全新的一天,最近为工作上的事有点闹心,不过学习的心不变,还是需要坚持不懈的努力。今天的任务是实现短信备份功能,这个比较简单,就是读取系统短信数据库,然后解析成 xml 标签格式保存到 sms.xml 文件中。需要保存的信息有:
- 短信号码:对方的电话号码
- 短信时间
- 阅读状态,是已读还是未读
- 短信类型,是发送的短信还是接收的短信
- 短信内容
关于项目相关文章,请访问:
- Android 项目:手机安全卫士(8)—— 管理员权限
- Android 项目:手机安全卫士(9)—— 手机号码归属地查询
- Android 项目:手机安全卫士(10)—— 电话归属地显示
- Android 项目:手机安全卫士(11)—— 归属地提示框拖拽效果
- Android 项目:手机安全卫士(12)—— 通讯卫士之电话、短信黑名单设置与拦截
- Android 项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断
项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe
2 实现短信备份功能
为了以后方便,我们用一个工具类来实现此功能,创建 SmsUtils 类,实现短信备份,实现该功能,需要添加权限:
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
短信备份代码如下:
public static void smsBackup(Context context, File output, SmsCallback callback) {
// 1.读取短信数据库 mmssms.db/sms
// 2.将短信数据输出为xml文件
//数据库字段:
// address: 短信号码
// date:短信时间
// read: 1表示已读, 0表示未读
// type: 类型 1:收到短信, 2表示发出的短信
// body: 短信内容
try {
XmlSerializer xml = Xml.newSerializer();
xml.setOutput(new FileOutputStream(output), "utf-8");
xml.startDocument("utf-8", true);
xml.startTag(null, "smss");
//查询短信
Cursor cursor = context.getContentResolver().query(Uri.parse("content://sms"),
new String[]{"address", "date", "read", "type", "body"}, null, null, null);
if (cursor != null) {
callback.preSmsBackup(cursor.getCount());//回传短信总数
//读取数据,并写入xml文件
int progress = 0;
while (cursor.moveToNext()){
xml.startTag(null, "sms");
//短信号码
xml.startTag(null, "address");
String address = cursor.getString(cursor.getColumnIndex("address"));
xml.text(address);
xml.endTag(null, "address");
//短信日期
xml.startTag(null, "date");
String date = cursor.getString(cursor.getColumnIndex("date"));
xml.text(date);
xml.endTag(null,"date");
//短信阅读状态
xml.startTag(null, "read");
String read = cursor.getString(cursor.getColumnIndex("read"));
xml.text(read);
xml.endTag(null,"read");
//短信类型
xml.startTag(null, "type");
String type = cursor.getString(cursor.getColumnIndex("type"));
xml.text(type);
xml.endTag(null,"type");
//短信内容
xml.startTag(null, "body");
String body = cursor.getString(cursor.getColumnIndex("body"));
xml.text(body);
xml.endTag(null, "body");
xml.endTag(null, "sms");
progress++;
// 更新进度的方法,可以放在子线程
callback.onSmsBackup(progress);//回传备份进度
Thread.sleep(500);// 模拟耗时操作
}
cursor.close();
}
xml.endTag(null,"smss");
xml.endDocument();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
首先创建一个 xml 文件的解析对象:XmlSerializer,设置它的文件路径、开始标签;然后通过系统 ContentProvider 查询短信数据;遍历查询结果,并写入 xml 流中;最后打上结束标签,保存文件。由于这是一个好事操作,所以我们会在外面加一个线程来执行…你说为什么不在这里加?因为这个短信备份功能涉及到一个备份进度框的显示与关闭,如果在这里加线程的话,进度显示就会一闪而过,而想要在短信备份完成后再关闭进度框的话,则需要加回调函数以及 Handler 对象,为了一个功能整这么多,不值得,所以在外边加一个线程即可,至于怎么加,别急,待会就能看到了。
不过,加一个回调接口还是有必要的,毕竟进度框会设置一个最大值,以及实时的进度值,所以,我们需要定义一个接口,当然,接口的使用方法已经来上面的代码中体现了。
/**
* 短信备份的回调接口
*
*/
public interface SmsCallback {
/**
* 备份短信前的回调
* @param totalCount 短信总数
*/
void preSmsBackup(int totalCount);
/**
* 备份过程中的回调
* @param progress 备份进度(备份短信条数)
*/
void onSmsBackup(int progress);
}
3 显示备份进度
我们在高级工具菜单中,增加一个二级菜单,叫做短信备份,点击后就可以进行短信备份,效果如图所示:
后台代码如下:
/** 备份短信 */
private void smsBackup() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/sms.xml";
final File output = new File(path);
final ProgressDialog dialog = new ProgressDialog(ToolsActivity.this);
dialog.setTitle("正在短信备份");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平方向展示进度条
dialog.show();
//短信备份
new Thread(){
@Override
public void run() {
SmsUtils.smsBackup(ToolsActivity.this, output, new SmsUtils.SmsCallback() {
@Override
public void preSmsBackup(int totalCount) {
dialog.setMax(totalCount);
}
@Override
public void onSmsBackup(int progress) {
dialog.setProgress(progress);
}
});
dialog.dismiss();
}
}.start();
}else {
showToast("没有找到sdcard");
}
}
先创建一个 ProgressDialog 对象,设置标题与进度条,然后在线程中调用短信备份的方法,在回调函数中实现进度的更新,最后备份完成后关闭进度显示框。
4 总结
今天的任务比较简单,略微轻松一下,我也该去找工作了,呵呵。
关于项目相关文章,请访问:
- Android 项目:手机安全卫士(8)—— 管理员权限
- Android 项目:手机安全卫士(9)—— 手机号码归属地查询
- Android 项目:手机安全卫士(10)—— 电话归属地显示
- Android 项目:手机安全卫士(11)—— 归属地提示框拖拽效果
- Android 项目:手机安全卫士(12)—— 通讯卫士之电话、短信黑名单设置与拦截
- Android 项目:手机安全卫士(13)—— 通讯卫士之电话拦截与挂断
项目源码地址(实时更新):https://github.com/xwdoor/MobileSafe
本文介绍如何在Android设备上实现短信备份功能,包括读取短信数据库并将其转换为XML格式保存。
490

被折叠的 条评论
为什么被折叠?



