Android 存储学习之保存系统短信到SD卡

本节学习,保存系统短信到SD卡中。既然是要保存系统短信到SD卡中,前提是先要拿到系统的短信,关于如何读取系统的短信,请看我的关于ContentProvider文章:

Android 四大组件学习之ContentProvider三

既然知道了任务的目的,那我们就直接实现。我们先将系统的短信读出,然后保存到xml文件中,然后将xml文件写到sd卡中。

1: 先将系统短信读出

//得到ContentResolver
ContentResolver cr = getContentResolver();

//查询系统的短信,只需要查询我们关心的字段
Cursor cursor = cr.query(Uri.parse("content://sms"), new String[]{"address", "date", "type", "body"},
		null, null, null);

//取出查询到的信息
while(cursor.moveToNext())
{
	String address = cursor.getString(cursor.getColumnIndex("address"));
	String date = cursor.getString(cursor.getColumnIndex("date"));
	String type = cursor.getString(cursor.getColumnIndex("type"));
	String body = cursor.getString(cursor.getColumnIndex("body"));

	//将每条短信放入List集合中
	Message msg = new Message(address, date, type, body);
	list.add(msg);
}

2: 其中Message是我定义的关于短信的类

public class Message {
	private String address; //号码
	private String date;    //时间
	private String type;    //类型:1为发生,2为接受
	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 String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getBody() {
		return body;
	}
	public void setBody(String body) {
		this.body = body;
	}
	@Override
	public String toString() {
		return "Message [address=" + address + ", date=" + date + ", type="
				+ type + ", body=" + body + "]";
	}
	public Message(String address, String date, String type, String body) {
		super();
		this.address = address;
		this.date = date;
		this.type = type;
		this.body = body;
	}
}

3:将短信的内容拼接为一个xml文件

//使用stringBuffer将短信内容拼接为xml文件
    	StringBuffer sBuffer = new StringBuffer();
    	//xml文件的头
    	sBuffer.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
    	//xml文件的开始标签
    	sBuffer.append("<Message>");
    	for (Message sms : list) {
			sBuffer.append("<sms>");

			//插入联系人号码字段
			sBuffer.append("<address>");
			sBuffer.append(sms.getAddress());
			sBuffer.append("</address>");

			//插入联系人类型字段
			sBuffer.append("<type>");
			sBuffer.append(sms.getType());
			sBuffer.append("</type>");

			//插入消息的内容
			sBuffer.append("<body>");
			sBuffer.append(sms.getBody());
			sBuffer.append("</body>");

			//插入消息的时间
			sBuffer.append("<date>");
			sBuffer.append(sms.getDate());
			sBuffer.append("</date>");

			sBuffer.append("</sms>");
		}
    	//结束标签
    	sBuffer.append("</Message>");

4:将xml文件写入到sd卡中

File file = new File("sdcard/sms.xml");
    	try {
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(sBuffer.toString().getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

整个代码流程为:

public class MainActivity extends Activity {

	List<Message> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        list = new ArrayList<Message>();
    }

    public void storageMessage(View v)
    {
    	//得到ContentResolver
    	ContentResolver cr = getContentResolver();

    	//查询系统的短信,只需要查询我们关心的字段
    	Cursor cursor = cr.query(Uri.parse("content://sms"), new String[]{"address", "date", "type", "body"},
    			null, null, null);

    	//取出查询到的信息
    	while(cursor.moveToNext())
    	{
    		String address = cursor.getString(cursor.getColumnIndex("address"));
    		String date = cursor.getString(cursor.getColumnIndex("date"));
    		String type = cursor.getString(cursor.getColumnIndex("type"));
    		String body = cursor.getString(cursor.getColumnIndex("body"));

    		//将每条短信放入List集合中
    		Message msg = new Message(address, date, type, body);
    		list.add(msg);
    	}

    	//使用stringBuffer将短信内容拼接为xml文件
    	StringBuffer sBuffer = new StringBuffer();
    	//xml文件的头
    	sBuffer.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
    	//xml文件的开始标签
    	sBuffer.append("<Message>");
    	for (Message sms : list) {
			sBuffer.append("<sms>");

			//插入联系人号码字段
			sBuffer.append("<address>");
			sBuffer.append(sms.getAddress());
			sBuffer.append("</address>");

			//插入联系人类型字段
			sBuffer.append("<type>");
			sBuffer.append(sms.getType());
			sBuffer.append("</type>");

			//插入消息的内容
			sBuffer.append("<body>");
			sBuffer.append(sms.getBody());
			sBuffer.append("</body>");

			//插入消息的时间
			sBuffer.append("<date>");
			sBuffer.append(sms.getDate());
			sBuffer.append("</date>");

			sBuffer.append("</sms>");
		}
    	//结束标签
    	sBuffer.append("</Message>");

    	File file = new File("sdcard/sms.xml");
    	try {
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(sBuffer.toString().getBytes());
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

    }
}

当点击按钮保存系统短信后,可以在sd卡的目录下找到sms.xml文件

导出xml文件打开:

以其中一条短信为例:

ok。关于如何备份短信就讲到这里

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:38:06

Android 存储学习之保存系统短信到SD卡的相关文章

Android 存储学习之保存系统短信到SD卡(使用XML序列化器)

上节中我们是手动拼接xml文件,但是上节中那样的做法会有一个问题,比如: //插入消息的内容 sBuffer.append("<body>"); sBuffer.append(sms.getBody() + "</body>"); sBuffer.append("</body>"); 我在插入消息内容的时候,在追加内容里面加了个 </body>. 这样就会出现解析错误的 所以这节我们使用xml的序列

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

Android黑科技,读取用户短信+修改系统短信数据库

安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证码,一些app马上就能自动获取并填上验证码,省去我们手动填写验证码.原理就是通过Android的ContentProvider组件间接访问系统的短信数据库,获取所有短信内容.下面来演示一下. 布局很简单,如下: 代码如下: public class MainActivity extends Acti

Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!

刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID所代表的控件,而现在使用的ADT在layout下除了activity_main .xml还多生成了一个fragment_main.xml.我就是把控件写在了后一个布局文件中.想请问下,使用什么样的方法是在fragment_main.xml去寻找控件呢? 回答:在PlaceHolderFragment

Android 存储学习之使用SharedPreference保存文件

上两节我们都是使用文本文件保存用户的信息,这明显是存在漏洞的.同时对文件中的内容不好管理.今天我们学习用SharedPreference保存.sharedPreference是专门保存一些比较零散的数据的. 我们还是用上节的例子分析,将用户的信息使用SharedPreference来保存. 注意:如果不知道是什么例子,请看Android 存储学习之在内部存储中读写文件 当点击确定按钮后,就会保存用户的信息: public void login(View v) { String name = ed

Android 监听系统短信广播

使用场景: 1.对系统接收到的短信进行识别,是广告或者是诈骗等 2.对短信内容进行过滤或者是对内容进行提取,比如验证码提取 3.对系统短信进行拦截,连系统自己都不让收到了(不会出现在系统数据里面,也不会有系统短信的通知栏提示) 备注: 1.系统短信广播为有序广播,要拦截的话,需要在注册广播的时候设置广播优先级为最大,不过这种也有风险,如果被其他的应用先拦截了,那么我们将不再收到,使用时需注意. 2.要接到系统短信广播,那么应用必须具备短信读取权限,这对使用者来说可能是一个限制 3.除了短信读取权

Android从普通发送和接收短信到对短信进行拦截

概述: 说实话,关于Android中对短信的一些相关操作是一个比较入门的东西.那我现在还要来写这一篇博客的原因只是因为现在开发中有相关内容,而又想将这些东西分享给更多的人来学习,同时在以后对Android系统的短信进行其他学习的时候也就放在这里做一个记录了,于是就写了这篇啰嗦的文章.如果你觉得这是一个不错的东西,欢迎收藏,以便在以后更方便地查看本人在此篇文章中更新的内容.下面我就从标题中的三个方面来对Android系统中的短信操作进行一个简单地学习. 短信的发送 由于Android中对短信发送方

009_01访问系统短信数据库

1 package com.example.visit_sms_db; 2 3 import android.app.Activity; 4 import android.content.ContentResolver; 5 import android.content.ContentValues; 6 import android.database.Cursor; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import an