我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个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. linux中挂载硬盘报错(you must specify the filesystem type)

    公司有台服务器做了raid1,由于容量小,需扩容,原先打算再添加两块硬盘进去做多一组raid1,组成两组raid1混合使用,但是公司抠门,买到服务器只能安装3块硬盘,无奈之下只能放多一块进去单独挂载分 ...

  2. 报错:ORA-02287: 此处不允许序号

    CREATE TABLE MY_TAB (N1 NUMBER(5),N2 DATE);          SELECT  * FROM MY_TAB;          CREATE SEQUENCE ...

  3. 读取url(1

    就书本例子 import java.io.InputStream; import java.net.URL; public class Test { public static void main(S ...

  4. 【COGS495】窗口

    [问题描述] 给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表: Window position Min value Max val ...

  5. bzoj2534: Uva10829L-gap字符串

    Description 有一种形如uvu形式的字符串,其中u是非空字符串,且V的长度正好为L,那么称这个字符串为L-Gap字符串 给出一个字符串S,以及一个正整数L,问S中有多少个L-Gap子串. I ...

  6. codevs 2152 滑雪

    2152 滑雪  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场 ...

  7. nil、Nil、NULL与NSNull的区别--备用

    我们来分别介绍一下这四种类型: 一.nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉: 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统 ...

  8. Solr4.8.0源码分析(18)之缓存机制(一)

    Solr4.8.0源码分析(18)之缓存机制(一) 前文在介绍commit的时候具体介绍了getSearcher()的实现,并提到了Solr的预热warn.那么本文开始将详细来学习下Solr的缓存机制 ...

  9. STM32f103------ADC(DMA)

    STM32F10x  ADC 技术指标: 分辨率: 12位分辨率  LSB=Vref+  / 2^(12) 转换时间: 采样一次至少14个ADC时钟周期 ,而ADC最高时钟周期为14MHz  选用采样 ...

  10. java指纹识别+谷歌图片识别技术

    http://www.icodeguru.com/3/2451.html http://valseonline.org/thread-124-1-1.html