Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个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--读取用户的短信内容以及短信备份的更多相关文章
- Android项目实战--手机卫士开发系列教程
<ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件 保存到相册 2 分钟前 上传 Android项目实战--手机卫士01- ...
- Android 项目实战--手机卫士(实现splash)
从今天开始根据之前学习的android的基础知识,实战一下,实现一个简单功能的android手机卫士 本文地址:http://www.cnblogs.com/wuyudong/p/5899283.ht ...
- Android项目实战--手机卫士24--程序锁的实现以及逻辑
昨天我们已经把程序全部读取出来,显示到界面上了,那今天,我们就来讲一下那个程序锁的实现啦.其实也很简单啦,我们主要就是把用户要锁定的程序放到一个表里面,然后就监听手机里面的任务栈,如果发现任务栈里面出 ...
- Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...
- Android项目实战手机安全卫士(02)
目录 项目结构图 源代码 运行结果 项目源代码 项目结构图 源代码 清单 01. SplashActivity.java package com.coderdream.mobilesafe.acti ...
- Android项目实战手机安全卫士(01)
目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...
- (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
- Android项目实战(四十四):Zxing二维码切换横屏扫描
原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...
- Android项目实战(二十五):Android studio 混淆+打包+验证是否成功
前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...
随机推荐
- AFNetworking使用详解
导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- TCP\UDP链接的异同
简单的说TCP与UDP的区别是有无连接状态.TCP是有连接状态的,而UDP没有,所以TCP是一种比较安全的通讯协议,而UDP则比较方便 TCP 127.0.0.1:1026 0.0.0.0:0 LIS ...
- SCJP_104——题目分析(4)
14. which three are valid declaraction of a float? ADFA. float foo=-1; B. float foo=1.0; C. float fo ...
- mysql的mvcc(多版本并发控制)
mysql的mvcc(多版本并发控制) 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能. 什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列 ...
- android.support.design.widget.AppBarLayout 在android5.0+底部显示空白条问题
在最外层使用 RelativeLayout作为根节点,同时设置 android:fitsSystemWindows="true"问题解决. <?xml version=&qu ...
- 关于.net的概念
IIS不仅仅是asp.net还有php等 所以w3wp是基本单元. 然后Managed Code加载 AppDomain, 不管是桌面程序还是asp.net程序 System.Web(HttpRunt ...
- Neutron网络-OPENSTACK讲得比较透和方便
http://www.ustack.com/blog/neutron_intro/ Neutron是OpenStack核心项目之一,提供云计算环境下的虚拟网络功能.Neutron的功能日益强大,并在H ...
- C#程序设计基础——变量
变量表示数值,字符串值或类的对象.变量存储的值可能会发生更改,但名称保持不变.C#是一种强类型语言,在变量中存储值之前,必须指定变量的类型. 变量的命名规则: 1-变量只能有字母,数字和下划线三种字符 ...
- ISO7816协议中几个时间
T=0协议 第一.初始等待时间: 复位应答时,卡片回复的连续两个数据的起始沿之间的时间间隔,这个时间间隔不超过9600etu, 在波 特率为9600是,该时间为1s 第二.GT: 两个连续字符之间的最 ...