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

摘要:
我们今天要讨论的是手机卫士高级工具中的短信备份功能。事实上,这个软件备份功能也非常简单。它读取用户的SMS并将其写入xml或数据库,但我们将其读取到xml。

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

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

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

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

Android项目实战--手机卫士18--读取用户的短信内容以及短信备份第1张


我们要备份短信,那么我们肯定就要先把短信的内容给读取出来啦,其实读取短信的内容也很简单,我们可以参考一下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--读取用户的短信内容以及短信备份》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mac终端常用命令Java循环结构下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Toolbar 工具栏 菜单 标题栏 Menu

要使用Toolbar,要先将标题栏(ActionBar)关掉; style.xml中:<style name="MainActivityTheme" parent="Theme.AppCompat.Light.NoActionBar"/>AndroidManifest.xml中:<activity android:name=".MainA...

LinearLayout布局

布局代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layou...

Android-自己定义PopupWindow

Android-自己定义PopupWindow 2014年5月12日 PopupWindow在应用中应该是随处可见的,非经常常使用到,比方在旧版本号的微信其中就用到下拉的PopupWindow。那是自己定义的。新版微信5.2的ActionBar,有人已经模仿了它,但微信详细是使用了ActionBar还是其它的笔者倒是不太清楚。本篇博客主要介绍怎样自己定...

安卓模拟器

作者:匿名用户链接:https://www.zhihu.com/question/24815978/answer/130805145来源:知乎著作权归作者所有,转载请联系作者获得授权。目前市面上安卓模拟器软件看着种类繁多,但其实只有两大流派:Bluestacks和Virutalbox。Bluestacks的历史可以追溯到2011年,是最早在PC上实现流畅运...

Android直播实现 Android端推流、播放

原文地址  :http://www.cnblogs.com/endv/p/7487685.html 最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码就可实现编码、推流和取流播放,整理了一下做了一个demo...

[转]如何让Android字体自适应屏幕分辨率

本文转自:http://www.cnblogs.com/tt_mc/archive/2012/03/10/2389555.html 在不同的分辨率下,Android字体大小怎么自适应分辨率的变化? 假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240,values-480x320。然后在文件夹values...