Android(java)学习笔记247:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)
1. 通过阅读系统源码我们知道:
短信的内容提供者:
content://sms/ 系统短信的内容提供者的路径
2. 利用ContentProvider备份和还原手机短信:
(1)新建一个Android工程,命名为"短信备份助手",如下:
(2)我们先实现UI布局,activity_main.xml,如下:
<LinearLayout 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:orientation="vertical"
tools:context="com.himi.smsbackup.MainActivity" > <Button
android:onClick="smsBackup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="备份" />
<Button
android:onClick="smsRestores"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="还原" /> </LinearLayout>
布局效果如下:
(3)编写MainActivity,如下:
package com.himi.smsbackup; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer; import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 短信备份
* @param view
*/
public void smsBackup(View view) {
try {
// 系统短信数据库是私有的,不能访问,只能使用内容提供者ContentProvider去访问
ContentResolver resolver = getContentResolver();
// 指定Uri
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[] { "address",
"date", "type", "body" }, null, null, null);
// 存储为xml文件,跨平台
// 获取一个xml的序列化器serializer
XmlSerializer serializer = Xml.newSerializer();
// 初始化设置xml序列化器serializer
File file = new File(Environment.getExternalStorageDirectory(),
"backup.xml");
FileOutputStream os = new FileOutputStream(file);
serializer.setOutput(os, "utf-8"); // 写xml文件的头
serializer.startDocument("utf-8", true);
serializer.startTag(null, "root");
while (cursor.moveToNext()) {
serializer.startTag(null, "sms"); serializer.startTag(null, "address");
String address = cursor.getString(0);
serializer.text(address);
serializer.endTag(null, "address"); serializer.startTag(null, "date");
String date = cursor.getString(1);
serializer.text(date);
serializer.endTag(null, "date"); serializer.startTag(null, "type");
String type = cursor.getString(2);
serializer.text(type);
serializer.endTag(null, "type"); serializer.startTag(null, "body");
String body = cursor.getString(3);
serializer.text(body);
serializer.endTag(null, "body"); serializer.endTag(null, "sms");
}
cursor.close();
serializer.endTag(null, "root");
serializer.endDocument();
os.close();
Toast.makeText(this, "备份成功", 0).show();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
Toast.makeText(this, "备份失败", 0).show();
}
} /**
* 还原用户的备份的短信数据
* 还原之前要提醒用户是否要覆盖旧的数据
* @param view
*/
public void smsRestores(View view) {
File file = new File(Environment.getExternalStorageDirectory(),
"backup.xml");
//file.lastModified();获取文件上一次备份时间
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("提醒");
builder.setMessage("是否清除旧的短信?");
builder.setPositiveButton("确实清除", new OnClickListener() { public void onClick(DialogInterface dialog, int which) {
Uri uri = Uri.parse("content://sms/");
getContentResolver().delete(uri, null, null);
restore(); }
});
builder.setNegativeButton("不清楚数据", new OnClickListener() { public void onClick(DialogInterface dialog, int which) {
restore(); }
}); builder.show();
} public void restore() {
try { File file = new File(Environment.getExternalStorageDirectory(),
"backup.xml");
FileInputStream is = new FileInputStream(file);
//获取xml的pull解析器
XmlPullParser parser = Xml.newPullParser();
//初始化设置xml的pull解析器
parser.setInput(is, "utf-8");
int type = parser.getEventType(); String address = null;
String date = null;
String smstype = null;
String body = null;
while(type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
//开始解析标签
if("address".equals(parser.getName())) {
address = parser.nextText();
}else if ("date".equals(parser.getName())){
date = parser.nextText();
}else if ("type".equals(parser.getName())){
smstype = parser.nextText();
}else if ("body".equals(parser.getName())){
body = parser.nextText();
} break; case XmlPullParser.END_TAG:
if ("sms".equals(parser.getName())) {
// 结束解析标签,把短信的数据加入到系统短信应用数据库中
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
ContentValues values = new ContentValues();
values.put("address", address);
values.put("date", date);
values.put("type", smstype);
values.put("body", body);
resolver.insert(uri, values);
}
break;
}
type = parser.next();//指向下一待解析的标签
}
Toast.makeText(this, "还原成功", 0).show();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
Toast.makeText(this, "还原失败", 0).show();
} }
}
上面使用到要存取数据到SD卡,要添加相应的权限。同时读取系统短信应用也需要相应的权限,AndroidMainfest.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.himi.smsbackup"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<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=".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>
(4)布署程序到模拟器上,如下:
•我们先在模拟器上模拟发送和接收几条短信,如下:
•回到上面我们编写的应用程序中,点击"备份",提示备份成功,如下:
•查看Sd保存路径,如下图,导出这个backup.xml文件到桌面,然后使用IE打开这个backup.xml文件,如下:
•这个时候,我们去删除模拟器上的短信,如下:
•回到编写的应用程序中,点击"还原",如下:
•回到系统短信页面,看到:
Android(java)学习笔记247:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)的更多相关文章
- Android(java)学习笔记191:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)
1. 通过阅读系统源码我们知道: 短信的内容提供者: content://sms/ 系统短信的内容提供者的路径 2. 利用ContentProvider备份和还原手机短信: (1 ...
- [知了堂学习笔记]_Java代码实现MySQL数据库的备份与还原
通常在MySQL数据库的备份和恢复的时候,多是采用在cmd中执行mysql命令来实现. 例如: mysqldump -h127.0.0.1 -uroot -ppass test > d:/tes ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 20145316许心远《Java学习笔记(第8版)》课程总结
20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...
随机推荐
- magento后台 Fatal error: Call to a member function getId() on a non-object in错误
后台分类管理出现错误 Fatal error: Call to a member function getId() on a non-object in 在数据库中运行以下sql语句 INSERT I ...
- php实现base64编码
工作需要,想弄一个加密的串,就想仿照base64的编码方式,写一个加密的方法,所以就有了下面这个用php实现的base64的代码 <?php /** * Base64 编码/解码 * @auth ...
- Unity3d Material(材质) 无缝拼接
Unity3d Material(材质) Edit by @灰太龙 在做一个项目的过程中,遇到动态切换壁纸的功能,问题点在无缝拼接! 那我们先查查Unity3d 中的材质球,里面有个参数 Tiling ...
- Request.url用法
原文:Request.url用法 我們在開發網頁應用程式,時常需要去解析網址(Request.Url)的每個片段,進行一些判斷.例如說 "http://localhost:1897/News ...
- ASP.NET服务器推送及前后台实时交互
一:项目需求 页面需要做一个上传Excel功能,并处理Excel中的数据到数据库中 这是一个较为漫长的过程 这时我需要在页面上显示处理进度的提示,给用户一个良好的体验 比如给用户提示“正在上传文档”, ...
- soap协议
定义: 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息. 协议中的几个关键词术语: SO ...
- MongoDB主从配置
master的配置 # cat mongod.conf dbpath = /app/sinova/mongodata/db #指定数据库目录 logpath = /app/sin ...
- Light OJ 1030 - Discovering Gold
题目大意: 给你一个1*N的方格,你初始位置是在1,给你一个骰子,假设你现在的位置是X,你投掷一个骰子掷的点数是y, 那么你的新位置就是 X+y, 并且你可以得到新位置的宝藏.假如X+y > N ...
- 怎么添加项目到SVN上面
一.通过SVN客户端向服务器上面添加项目 1.在服务器上面创建一个文件夹,文件夹以项目名称命名. 2.在合适目录下右击后,点击SVN Checkout,将你在服务器上面创建的目录checkout下来 ...
- UVaLive5031 Graph and Queries(时光倒流+名次树)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20332 [思路] 时光倒流+名次树(rank tree). 所谓“ ...