博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
阅读量:6411 次
发布时间:2019-06-23

本文共 5436 字,大约阅读时间需要 18 分钟。

我们今天要说的就是我们手机卫士里面的高级工具里面的短信备份功能啦,其实这个软件备份的功能也很简单,就是把用户的短信读出来,然后写到一个xml或者数据库里面,

但我们这里的是读取到xml里面的。

首先我们就先在我们的高级工具里面新增两个条目啦,一个是短信备份,一个是短信恢复,就像下面的图一样,具体的那个类的代码我就不粘出来了,因为高级工具这个类挺长的

大家看也看得不爽,如果有什么不明白的,可以看看我们前面的内容

我们要备份短信,那么我们肯定就要先把短信的内容给读取出来啦,其实读取短信的内容也很简单,我们可以参考一下Android自己的短信管理器是怎样写的,然后我们照着写就行啦,那怎样拿到Android自己的短信管理器的源码呢,有两种方法,一种就是从Android的开源网站上下载,如果不会的可以看看我们的文章

还有和种方法就是拿到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
getSmsInfo() { List
infos = new ArrayList
(); 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
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文件里面注册一下它,然后再把短信操作的权限给加上

 

 

 

 

然后我们再回到com.xiaobin.security.ui.AToolActivity这个类里面啦,给备份的那个条目注册一个点击事件,然后一点击就开启备份的服务

 

 

case R.id.tv_atool_sms_backup : 				Intent backupIntent = new Intent(this, BackupSmsService.class);				startService(backupIntent);				break;

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

 

 

你可能感兴趣的文章
Tensorflow Serving 模型部署和服务
查看>>
Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet 3.0+JSP 2.2深入剖析与实例应用
查看>>
topcoder srm 680 div1 -3
查看>>
具体数学第二版第四章习题(1)
查看>>
高效前端优化工具--Fiddler入门教程
查看>>
【翻译】我钟爱的HTML5和CSS3在线工具
查看>>
Java多线程学习(吐血超详细总结)
查看>>
css3 变形
查看>>
Win7 64bit 安装Mysql5 出错 无法启动服务。
查看>>
嵌入式 H264参数语法文档: SPS、PPS、IDR以及NALU编码规律
查看>>
初识Opserver,StackExchange的监控解决方案
查看>>
给大家讲解一下JavaScript与后台Java天衣无缝相结合
查看>>
探索HTML5之本地文件系统API - File System API
查看>>
javascript有用代码块(1)
查看>>
libevent 笔记
查看>>
PHP实现人人OAuth登录和API调用
查看>>
redis源码笔记 - initServer
查看>>
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>