Android项目:手机安全卫士(14)—— 短信备份

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,短信备份)