`
永远吃不饱
  • 浏览: 10136 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

基于安卓短信的备份和恢复

 
阅读更多
        我做的是将短信备份到本地的一个xml文件中,简单方便。(注:适用于android 5.0 以前,毕竟5.0后增加了数据的安全性,没有了写入短信的权限。)
//创建XMl文件
    public boolean xmlCreate() throws IOException {
        String path = ESD_PATH + "/SMSBack";
        File file = new File(path);

        if (!file.exists()) {
            file.mkdirs();
        }
        File file1 = new File(path, "message.xml");
        try {
            //建立输出流
            fos = new FileOutputStream(file1);
            serializer = Xml.newSerializer();
            serializer.setOutput(fos, "UTF-8");
            serializer.startDocument("UTF-8", true);
            serializer.startTag("SMS", "sms");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Cursor cursor = null;

        try {
            // type=1是收件箱,==2是发件箱;read=0表示未读,read=1表示读过,seen=0表示未读,seen=1表示读过
            String[] projection = new String[]{Telephony.Sms.ADDRESS, Telephony.Sms.PERSON, Telephony.Sms.DATE, Telephony.Sms.PROTOCOL, Telephony.Sms.READ,
                    Telephony.Sms.STATUS, Telephony.Sms.TYPE, Telephony.Sms.REPLY_PATH_PRESENT, Telephony.Sms.BODY, Telephony.Sms.LOCKED, Telephony.Sms.ERROR_CODE, Telephony.Sms.SEEN};
            Uri uri = Uri.parse(SMS_URI_ALL);
            cursor = resolver.query(uri, projection, null, null, "_id asc");
            if (cursor.moveToFirst()) {
//                String subject;
//                String service_center;

                String address;
                String person;
                String date;
                String protocol;
                String read;
                String status;
                String type;
                String reply_path_present;
                String body;
                String locked;
                String error_code;
                String seen;

                //生成子标签
                do {

                    // 如果address == null,xml文件中是不会生成该属性的,为了保证解析时,属性能够根据索引一一对应,必须要保证所有的item标记的属性数量和顺序是一致的
                    address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
                    if (address == null) {
                        address = "";
                    }
                    person = cursor.getString(cursor.getColumnIndex(Telephony.Sms.PERSON));
                    if (person == null) {
                        person = "";
                    }
                    date = cursor.getString(cursor.getColumnIndex(Telephony.Sms.DATE));
                    if (date == null) {
                        date = "";
                    }
                    protocol = cursor.getString(cursor.getColumnIndex(Telephony.Sms.PROTOCOL));
                    if (protocol == null) {// 为了便于xml解析
                        protocol = "";
                    }
                    read = cursor.getString(cursor.getColumnIndex(Telephony.Sms.READ));
                    if (read == null) {
                        read = "";
                    }
                    status = cursor.getString(cursor.getColumnIndex(Telephony.Sms.STATUS));
                    if (status == null) {
                        status = "";
                    }
                    type = cursor.getString(cursor.getColumnIndex(Telephony.Sms.TYPE));
                    if (type == null) {
                        type = "";
                    }
                    reply_path_present = cursor.getString(cursor.getColumnIndex(Telephony.Sms.REPLY_PATH_PRESENT));
                    if (reply_path_present == null) {// 为了便于XML解析
                        reply_path_present = "";
                    }
                    body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
                    if (body == null) {
                        body = "";
                    }
                    locked = cursor.getString(cursor.getColumnIndex(Telephony.Sms.LOCKED));
                    if (locked == null) {
                        locked = "";
                    }
                    error_code = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ERROR_CODE));
                    if (error_code == null) {
                        error_code = "";
                    }
                    seen = cursor.getString(cursor.getColumnIndex(Telephony.Sms.SEEN));
                    if (seen == null) {
                        seen = "";
                    }
                    // 生成xml子标记
                    // 开始标记
                    serializer.startTag("SMS", "item");
                    // 加入属性
                    serializer.attribute("SMS", Telephony.Sms.ADDRESS,address);
                    serializer.attribute("SMS", Telephony.Sms.PERSON, person);
                    serializer.attribute("SMS", Telephony.Sms.DATE, date);
                    serializer.attribute("SMS", Telephony.Sms.PROTOCOL, protocol);
                    serializer.attribute("SMS", Telephony.Sms.READ, read);
                    serializer.attribute("SMS", Telephony.Sms.STATUS, status);
                    serializer.attribute("SMS", Telephony.Sms.TYPE, type);
                    serializer.attribute("SMS", Telephony.Sms.REPLY_PATH_PRESENT, reply_path_present);
                    try {
                        serializer.attribute("SMS", Telephony.Sms.BODY, body);
                    } catch (Exception e) {
                        Toast.makeText(context, body + "~不符合规格", Toast.LENGTH_SHORT).show();
                    }
                    serializer.attribute("SMS", Telephony.Sms.LOCKED, locked);
                    serializer.attribute("SMS", Telephony.Sms.ERROR_CODE, error_code);
                    serializer.attribute("SMS", Telephony.Sms.SEEN, seen);
                    // 结束标记
                    serializer.endTag("SMS", "item");

                } while (cursor.moveToNext());
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("ERROR", e.toString());
        } finally {
            if (cursor != null) {
                //回收资源
                cursor.close();
            }
        }

        serializer.endTag("SMS", "sms");
        serializer.endDocument();
        fos.flush();
        fos.close();

        return true;
    }

      可查看xml是否数据完整,不完整是由于某个短信的格式不对的问题。

      当然可以换一种格式,如以下方法,自行尝试。
serializer.startTag(namespace, name);
                    serializer.text(text);
                    serializer.endTag(namespace, name);

//恢复短信
    public void recoverSMS() {
        smsItems = this.getXmlItems();

        for (SmsItem smsItem : smsItems) {

            Cursor cursor = resolver.query(Uri.parse(SMS_URI_ALL), new String[]{Telephony.Sms.DATE},
                    Telephony.Sms.DATE + "=?", new String[]{smsItem.getDate()}, null);

            if (!cursor.moveToFirst()) {
                ContentValues values = new ContentValues();
                values.put(Telephony.Sms.ADDRESS, smsItem.getAddress());
                values.put(Telephony.Sms.PERSON, smsItem.getPerson().equals("") ? null : smsItem.getPerson());
                values.put(Telephony.Sms.DATE, smsItem.getDate());
                values.put(Telephony.Sms.PROTOCOL, smsItem.getProtocol().equals("") ? null : smsItem.getProtocol());
                values.put(Telephony.Sms.READ, smsItem.getRead());
                values.put(Telephony.Sms.STATUS, smsItem.getStatus());
                values.put(Telephony.Sms.TYPE, smsItem.getType());
                values.put(Telephony.Sms.REPLY_PATH_PRESENT, smsItem.getReply_path_present());
                values.put(Telephony.Sms.BODY, smsItem.getBody());
                values.put(Telephony.Sms.LOCKED, smsItem.getLocked());
                values.put(Telephony.Sms.ERROR_CODE, smsItem.getError_code());
                values.put(Telephony.Sms.SEEN, smsItem.getSeen());
                resolver.insert(Uri.parse(SMS_URI_ALL), values);
            }
            cursor.close();
        }
        Log.d(TAG, "getXmlItems complete");
    }

    //从XMl文件中获取到短信数据
    public List<SmsItem> getXmlItems() {
        SmsItem smsItem = null;
        XmlPullParser pullParser = Xml.newPullParser();
        String path = ESD_PATH + "/SMSBack/message.xml";
        File file = new File(path);

        //当文件不存在时
        if (!file.exists()) {
            Toast.makeText(context, "当前无备份文件", Toast.LENGTH_SHORT).show();
            return null;
        }

        try {

            FileInputStream fis = new FileInputStream(file);
            pullParser.setInput(fis, "UTF-8");
            int event = pullParser.getEventType();
            while (event != XmlPullParser.END_DOCUMENT) {
                switch (event) {
                    case XmlPullParser.START_DOCUMENT:
                        smsItems = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        if ("item".equals(pullParser.getName())) {
                            smsItem = new SmsItem();

                            smsItem.setAddress(pullParser.getAttributeValue(0));
                            smsItem.setPerson(pullParser.getAttributeValue(1));
                            smsItem.setDate(pullParser.getAttributeValue(2));
                            smsItem.setProtocol(pullParser.getAttributeValue(3));
                            smsItem.setRead(pullParser.getAttributeValue(4));
                            smsItem.setStatus(pullParser.getAttributeValue(5));
                            smsItem.setType(pullParser.getAttributeValue(6));
                            smsItem.setReply_path_present(pullParser.getAttributeValue(7));
                            smsItem.setBody(pullParser.getAttributeValue(8));
                            smsItem.setLocked(pullParser.getAttributeValue(9));
                            smsItem.setError_code(pullParser.getAttributeValue(10));
                            smsItem.setSeen(pullParser.getAttributeValue(11));
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("item".equals(pullParser.getName())) {
                            smsItems.add(smsItem);
                            Log.d(TAG, smsItem.toString());
                            smsItem = null;
                        }
                        break;
                }
                event = pullParser.next();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return smsItems;
    }

分享到:
评论

相关推荐

    安卓 android备份短信

    本文将深入探讨如何在Android设备上进行短信备份,以及使用"BackupSMS"等工具的相关知识。 首先,我们需要了解Android系统的默认备份功能。在Android 6.0及以上版本,系统提供了自动备份到Google账户的功能,包括...

    基于android数据备份恢复的一种实现.pdf

    【Android 数据备份恢复实现】 随着移动互联网的快速发展,Android设备上的数据变得日益重要,尤其是在3G时代,通讯录、日程、短信和邮件等数据的丢失可能会给用户带来极大困扰。针对这一问题,Android提供了数据...

    安卓手机数据备份及恢复软件有哪些看完你就知道选哪个了.pdf

    安卓手机用户需要选择合适的备份和恢复软件来保护他们的重要数据。下面我们将介绍几种常见的安卓手机数据备份及恢复软件,并对它们进行比较和分析,从而帮助用户选择合适的软件。 一、Titanium Backup Titanium ...

    安卓手机短信恢复 2.5官方安卓版

    这个过程涉及到对手机文件系统的深入理解,以及对SQLite数据库(通常用于存储Android短信)的解析。 短信恢复的过程通常包括以下步骤: 1. **安全连接**:首先,用户需要在手机上运行该应用,并确保应用获取必要的...

    基于android手机短信管理系统设计

    - **远程备份与恢复**:通过GPRS连接计算机,支持短信的远程备份和恢复功能。 #### 五、结论 该研究通过对Android平台的深入分析,结合具体应用场景,成功设计并实现了基于Android平台的手机短信管理系统。该系统...

    短信备份软件

    这个项目是基于Android系统开发的,允许用户将短信数据备份到Google云端硬盘或其他兼容的云服务中,以便于日后恢复或在不同设备间同步。 SMSBACKUP的开源特性意味着开发者和爱好者可以查看、学习甚至改进其源代码,...

    AndroidGmail备份手机短信源码.zip

    【Android Gmail备份手机短信源码】是一个针对Android操作系统开发的应用程序源码,它允许用户将手机中的短信备份到Gmail邮箱中。这个功能对于数据安全和管理个人通信记录非常重要,尤其是当你需要换新手机或者想要...

    android手机短信源码

    首先,Android短信服务主要基于TelephonyManager、SmsManager和ContentProvider等组件。`TelephonyManager`是获取手机通话状态和信息的主要接口,包括获取SIM卡信息、网络状态等。`SmsManager`则负责短信的发送和...

    Android程序研发源码Android Gmail备份手机短信源码.rar

    要将短信备份到Gmail,需要使用Google的Gmail API。首先,开发者需要在Google Cloud Console上创建一个项目,并启用Gmail API。接着,获取OAuth 2.0客户端ID和秘密,以便用户授权应用访问其Gmail账户。在应用中,...

    国产手机刷机备份恢复软件

    在IT行业中,刷机是指更改或替换手机操作系统的过程,通常是为了获取更多自定义选项、提升...总的来说,国产手机刷机备份恢复软件为用户提供了一种个性化的手机管理方式,但也要求用户具备一定的技术知识和风险意识。

    abe.jar android备份文件提取工具

    总的来说,"abe.jar"是Android开发者和高级用户的一个强大工具,它使我们能够探索和管理AB格式的备份文件,有助于数据恢复和分析。然而,正确使用这个工具是非常重要的,以免造成不必要的数据损失或隐私问题。在进行...

    基于Android的手机通讯录设计书

    通过创建一个基于Android的通讯录应用,用户可以方便地执行添加、查看、修改和删除联系人操作,以及拨打电话、发送短信和查询联系人。此外,软件提供独特的数据备份和恢复功能,允许用户将联系人信息导出到文本文件...

    基于Android的通讯录软件-安卓大作业(报告+apk+源码)

    最后,考虑到应用的可扩展性和用户体验,可能会涉及到通知、数据同步以及备份恢复等功能。例如,当有新的未接来电或短信时,应用可以通过Notification API向用户发送提醒。同时,开发者还可以利用ContentProvider...

    毕业设计-基于HBase实现的手机数据备份系统,实现了手机关键信息的备份,如短信、联系人、重要文件等。.zip

    6. 用户界面模块:提供友好的图形用户界面,使用户能方便地执行备份、恢复和管理操作。 7. 性能优化:通过对HBase的配置调优,如合理设置Region大小、负载均衡策略等,确保系统在高并发情况下仍能保持良好的性能。 ...

    基于Android系统的智能手机取证思路浅谈.pdf

    Android系统手机取证环境不同于计算机取证环境,需要具备屏蔽手机信号的设备及环境、手机连接、复制、仿真和维修相关硬件工具、手机数据读取、备份、恢复和分析相关工具软件及手机其他相关应用的一系列专用工具。...

    android隐私短信

    用户可以将隐私短信备份到云端或本地,需要时进行恢复。 6. **通知与提醒**:虽然隐私短信不会在通知栏显示具体内容,但通常会显示未读消息的数量,确保用户不会错过重要信息,同时保持隐私。 7. **其他高级功能**...

    毕业论文安卓805短信管理软件app.doc

    这款短信管理软件的主要设计目标包括:提供直观易用的用户界面,实现高效短信分类,支持快速搜索,具备短信备份和恢复功能,以及确保用户隐私的安全性。 3. 系统分析 在系统分析阶段,作者首先进行了需求分析,了解...

Global site tag (gtag.js) - Google Analytics