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.** {*;} ...
随机推荐
- Java序列化的机制和原理
Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...
- 【转】 NSArray copy 问题
转自: http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html 好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解 ...
- GCD多线程 在子线程中获取网络图片 在主线程更新
子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...
- [个人原创]关于java中对象排序的一些探讨(三)
这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...
- qt二维码示例
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://blog.csdn.net/hiwubihe/article/details/38679621,qq:1269122125. 移动终 ...
- C++简单工厂模式
核心思想:用一个工厂类根据不同的输入条件new出不同的派生类指针,然后由多态调用不同派生类中virtual函数,得到不同的结果 所有的判断处理在工厂类中完成,通过CreateFactory函数,根据不 ...
- 【NOI2006】最大获利
[问题描述] 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU 集团旗下的CS&T 通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就 ...
- html5插入视频
- a便签 rel属性改变链接打开页面的方式
<body> XHTML: <a href="http://www.baidu.com" rel="external">Baidu &l ...
- angularJS快速入门
1.引入脚本文件 <link rel="stylesheet" href="http://lib.sinaapp.com/js/bootstrap/v3.0.0/c ...