我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个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;

好啦,到现在为止,短信备份就差不多完成的啦,我们下一次说一下我们短信的恢复

今天源码下载

Android项目实战--手机卫士18--读取用户的短信内容以及短信备份的更多相关文章

  1. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

  2. Android 项目实战--手机卫士(实现splash)

    从今天开始根据之前学习的android的基础知识,实战一下,实现一个简单功能的android手机卫士 本文地址:http://www.cnblogs.com/wuyudong/p/5899283.ht ...

  3. Android项目实战--手机卫士24--程序锁的实现以及逻辑

    昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦.其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出 ...

  4. Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面

    好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...

  5. Android项目实战手机安全卫士(02)

    目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01.  SplashActivity.java package com.coderdream.mobilesafe.acti ...

  6. Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  7. (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例

    Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...

  8. Android项目实战(四十四):Zxing二维码切换横屏扫描

    原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...

  9. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

随机推荐

  1. ViewHolder的作用和用法

    一直都看别人用ViewHolder,自己也用过,却不知道它的作用是什么?但知道肯定很有用,而且现在android studio应该有直接生产Viewholder的插件, 不过博主我是个新手,就没尝试去 ...

  2. android 中Log - 简单使用

    例如,我们可以使用'Log.d'进行Debug,在java代码中输入Log.d(String tag, String message),tag为自己命名的tag,message为待输出的信息.然后打开 ...

  3. Oracle处理特殊字符

    检查数据库级的参数设置 select * from nls_database_parameters;

  4. 简单的js反选,全选,全不选

    <html> <head> <base href="<%=basePath%>"> <title>My JSP 'che ...

  5. [LeetCode OJ] Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  6. 跟我一起学CMake

    如今CMake使用的人数越来越多,包括我项目组里,很多大牛们在写Qt程序的时候都不用自带的qmake,貌似会出现很多问题,他们往往都用自己写的CMake来编译系统,今天我也和大家一起来学学这个高大上的 ...

  7. seo小技巧(转载)

    转载自前端网:五行缺火 优化技巧是老师在课堂上教不了你的,而自己也不可能在练习中领悟,最便捷的方法就是听取别人的经验,所以转载一下 SEO要点:1.语义化html标签,用合适的标签嵌套合适的内容,不可 ...

  8. Solr4.8.0源码分析(17)之SolrCloud索引深入(4)

    Solr4.8.0源码分析(17)之SolrCloud索引深入(4) 前面几节以add为例已经介绍了solrcloud索引链建索引的三步过程,delete以及deletebyquery跟add过程大同 ...

  9. 『Python』 ThreadPool 线程池模板

    Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: ...

  10. Hadoop 日志分析。

    http://www.ibm.com/developerworks/cn/java/java-lo-mapreduce/