自制Android中的短息备份器源码

短信的实体bean

package com.examp.backsms.domain;

public class SmsInfo {
	private String address;
	private String date;
	private String type;
	private String body;

	public SmsInfo() {
	}

	public SmsInfo(String address, String date, String type, String body) {
		this.address = address;
		this.date = date;
		this.type = type;
		this.body = 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 "SmsInfo [address=" + address + ", date=" + date + ", type="
				+ type + ", body=" + body + "]";
	}

}

核心代码

package com.examp.backsms;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

import com.examp.backsms.domain.SmsInfo;
import com.examp.backsms.util.SmsUtils;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void backSms(View view) {

        // 创建被叫主机名
        Uri uri = Uri.parse("content://sms/");
        // 获取内容解析器
        ContentResolver resolver = getContentResolver();
        // 执行查询,得到结果集
        Cursor cursor = resolver.query(uri, new String[] { "address", "date",
                "type", "body" }, null, null, null);
         //创建短信的集合
         List<SmsInfo> infos = new ArrayList<SmsInfo>();
         //逐一添加到集合
         while (cursor.moveToNext()) {
            SmsInfo info = new SmsInfo();
            info.setAddress(cursor.getString(cursor.getColumnIndex("address")));
            info.setBody(cursor.getString(cursor.getColumnIndex("body")));
            info.setDate(cursor.getString(cursor.getColumnIndex("date")));
            info.setType(cursor.getString(cursor.getColumnIndex("type")));
            infos.add(info);
        }
        //通过工具类调用备份的业务
        //将集合|本活动的上下文传入
         SmsUtils.backupSms(infos, this);
        cursor.close();
    }

}

工具类

package com.examp.backsms.util;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import android.content.Context;
import android.os.Environment;
import android.util.Xml;
import android.widget.Toast;

import com.examp.backsms.domain.SmsInfo;

public class SmsUtils {
	public static void backupSms(List<SmsInfo> smsInfos, Context context) {
		try {
			// 创建XML序列化器
			XmlSerializer serializer = Xml.newSerializer();
			File file = new File(Environment.getExternalStorageDirectory(),
					"backupSms.xml");
			FileOutputStream os = new FileOutputStream(file);
			// 初始化xml序列化器,指定xml数据写入到那个文件,并且制定文件的编码方式
			serializer.setOutput(os, "utf-8");
			// 设置<?xml version="1.0" encoding="utf-8"?>,及是否是独立的xml文件
			serializer.startDocument("utf-8", true);
			// 相当于<smss>
			serializer.startTag(null, "smss");
			for (SmsInfo info : smsInfos) {
				serializer.startTag(null, "sms");

				serializer.startTag(null, "body");
				serializer.text(info.getBody());
				serializer.endTag(null, "body");

				serializer.startTag(null, "type");
				serializer.text(info.getType() + "");
				serializer.endTag(null, "type");

				serializer.startTag(null, "address");
				serializer.text(info.getAddress());
				serializer.endTag(null, "address");

				serializer.startTag(null, "date");
				serializer.text(info.getDate() + "");
				serializer.endTag(null, "date");

				serializer.endTag(null, "sms");
			}
			serializer.endTag(null, "smss");
			serializer.endDocument();
			os.close();
			Toast.makeText(
					context,
					"备份短信成功,备份储存路径为:"
							+ Environment.getExternalStorageDirectory()
							+ "backSms.xml", Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Toast.makeText(context, "备份短信息失败!!", Toast.LENGTH_SHORT).show();
			e.printStackTrace();
		}
	}
}

视图代码,由于只是一个案例,只有一个按钮

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="backSms"
        android:text="@string/bt_queryAll" />

</RelativeLayout>

权限清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.examp.backsms"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <!-- 获取 读写短信的权限 -->
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <!-- 获取写入SD卡的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.examp.backsms.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

资源文件string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">0019短信备份</string>
    <string name="action_settings">Settings</string>
    <string name="bt_queryAll">备份短信</string>

</resources>

注:本代码只是事例代码,不能够承受过大的数据压力,所以实际开发的时候是边读数据边备份.

自制Android中的短息备份器源码

时间: 2024-10-07 14:17:15

自制Android中的短息备份器源码的相关文章

Android短信插入器源码

package com.examp.createsms; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.net.Uri; import android.os.Bundle; public class MainActivity extends Activity { @Override protected

Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

Android音乐播放器(歌词.均衡器.收藏.qq5.0菜单.通知) 一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 下载地址:http://www.devstore.cn/code/info/1144.html 运行截图:     热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较

Android研发中对String的思考(源码分析)

1.常用创建方式思考: String text = "this is a test text "; 上面这一句话实际上是执行了三件事 1.声明变量 String text; 2.在内存中开辟空间 (内存空间一) 3.将变量的text的引用指向开辟的内存空间 当有 text = "this is a change text"; 这一句话执行了两件事 1.在内存中开辟空间 2.将变量text 的引用指向 新开辟的内存空间 3.内存空间一此时依然存在,这就是说明了Stri

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

Android View体系(八)从源码解析View的layout和draw流程

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 前言 上一篇文章我们讲了View的measure的流程,接下来我们

vbs-计算机硬件信息查看器-源码-.exe程序-可直接使用复制使用

vbs-计算机硬件信息查看器-源码-可直接使用复制使用 #----------------------------------------------------------------------------------------以下为源代码 msgbox "               正在加载本机配置信息,请按确认继续!       ", 40, "配置信息查询" On Error Resume Next   SerVerPath = "c:\硬件

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前

Android ListView动画特效实现原理及源码

Android 动画分三种,其中属性动画为我们最常用动画,且能满足项目中开发几乎全部需求,google官方包支持3.0+,我们可以引用三方包nineoldandroids来失陪到低版本.本例子中就是用属性动画实现效果. 对普通的View做动画,我们只要定义好要的动画ObjectAnimator或AnimatorSet,然后设置属性启动及可.但是,对ListView做动画应该如何.什么时候.在什么地方.对哪个View做动画属性呢? github上有成熟的listview动画包 https://gi

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con