Android 短信的备份
接着上文《Android 内容提供者的实现》,继续实战
打开File Exploer,找到mmssms.db数据库,导出

打开mmssms.db

新建项目,布局如下:
<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"
tools:context=".MainActivity" > <Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取所有的短信" /> </RelativeLayout>
代码如下:
package com.wuyudong.readsms; import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View view) {
// content://sms/
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[] { "address", "date",
"type", "body" }, null, null, null);
while (cursor.moveToNext()) {
String address = cursor.getString(0);
String date = cursor.getString(1);
String type = cursor.getString(2);
String body = cursor.getString(3);
System.out.println("address:" + address);
System.out.println("date:" + date);
System.out.println("type:" + type);
System.out.println("body:" + body);
System.out.println("--------------------");
}
cursor.close();
} }
运行之,提示错误:权限问题。于是添加权限android.permission.READ_SMS和android.permission.WRITE_SMS
再次运行,搞定,成功读取系统短信
接下来继续修改程序,使之完成短信的备份功能
新建文件smsInfo.java
package com.wuyudong.domain;
public class smsInfo {
private String body;
private String date;
private String type;
private String address; public smsInfo(String body, String date, String type, String address) {
super();
this.body = body;
this.date = date;
this.type = type;
this.address = address;
}
public String getBody() {
return body;
} public void setBody(String body) {
this.body = body;
} 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 getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
}
新建SmsUtils.java
package com.wuyudong.readsms; import java.io.File;
import java.io.FileOutputStream;
import java.util.List; import org.xmlpull.v1.XmlSerializer; import com.wuyudong.domain.smsInfo; import android.content.Context;
import android.os.Environment;
import android.util.Xml;
import android.widget.Toast; public class SmsUtils {
/**
*
* @param smsInfos 短信的集合
* @param context 上下文
*/
public static void backUpSms(List<smsInfo> smsInfos, Context context){
File file = new File(Environment.getExternalStorageDirectory(),
"backup1.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
// 获取xml序列化器
XmlSerializer xs = Xml.newSerializer();
xs.setOutput(fos, "utf-8");
//生成xml头
xs.startDocument("utf-8", true);
//添加xml根节点
xs.startTag(null, "message");
for (smsInfo info : smsInfos) {
xs.startTag(null, "sms");
xs.startTag(null, "body");
xs.text(info.getBody());
xs.endTag(null, "body");
xs.startTag(null, "date");
xs.text(info.getDate());
xs.endTag(null, "date");
xs.startTag(null, "address");
xs.text(info.getAddress());
xs.endTag(null, "address");
xs.startTag(null, "type");
xs.text(info.getType());
xs.endTag(null, "type");
xs.endTag(null, "sms");
}
xs.endTag(null, "message");
//生成xml头
xs.endDocument();
fos.close();
Toast.makeText(context, "备份成功", 0).show(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(context, "备份失败", 0).show();
}
}
}
添加权限:android.permission.WRITE_EXTERNAL_STORAGE
MainActivity.java中的代码如下:
package com.wuyudong.readsms; import java.util.ArrayList;
import java.util.List; import com.wuyudong.domain.smsInfo; import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View view) {
// content://sms/
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[] { "body", "date",
"type", "address" }, null, null, null);
List<smsInfo> smsinfos = new ArrayList<smsInfo>();
while (cursor.moveToNext()) {
String body = cursor.getString(0);
String date = cursor.getString(1);
String type = cursor.getString(2);
String address = cursor.getString(3);
smsInfo smsinfo = new smsInfo(body, date, type, address);
smsinfos.add(smsinfo);
}
cursor.close();
SmsUtils.backUpSms(smsinfos, this);
} }
运行项目后,生成backup1.xml文件,打开后
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<message>
<sms>
<body>ggg</body>
<date>1466043889225</date>
<address>1223</address>
<type>1</type>
</sms>
<sms>
<body>dsfgfdg</body>
<date>1466043867803</date>
<address>34543</address>
<type>1</type>
</sms>
……………………
……………………
……………………
</message>
Android 短信的备份的更多相关文章
- Android之——短信的备份与还原
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47091281 眼下,Android手机中的一些软件能够实现手机短信的备份与还原操作 ...
- Android 短信的还原
上篇文章讲到<Android 短信的备份>,本文主要实现Android 短信的还原,即是将一条 布局文件: <RelativeLayout xmlns:android="h ...
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- Android短信备份及插入笔记
实现备份短信到xml文件和像短信中插入一条数据 一.实现短信将备份到xml文件中 在布局文件中定义一个按钮,定义点击事件为copyClick MainActivity.java: package co ...
- Android短信监听实现,及Android4.4之后短信机制变更
前阵子公司有一个项目,简单的监听短信应用,功能只有如下两个: 1.监听短信并获取短信内容上传服务器: 2.从服务器获取短信内容,发送出去 按照传统的思路,监听短信我们有两种方式:第一种是使用广播 ...
- Android短信发送器(2)
在上一篇的<Android短信发送器>当中.发送功能并不完好.当发送内容超过限定字数时,短信就会发送失败,此时就须要推断内容是否超过限制,假设不超过限制.就直接发送,反之.则对其进行处理再 ...
- 【mob】Android短信验证+源码
在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...
- Android 短信验证码控件
Android 短信验证码控件,便于项目中使用统一样式,统一提示改动.个人觉得挺好用的 <span style="font-size:18px;">public cla ...
- Android 短信监听及用途分析
监听系统短信这个只能作为一个技术点来研究下,读者可能在工作中可能不会哦涉及到,一般的应用软件也不会有这个需求 但是作为程序员呢,多了解一下也是好的. Android 监听系统短信有什么用? 1.对系统 ...
随机推荐
- 10套免费的 Photoshop UI 元素以及 PSD 素材
免费的 PSD 用户界面工具包以及可以编辑 Photoshop PSD 文件,有你需要的设计漂亮的用户界面和惊人使用体验.这些用户界面工具包可有免费下载,可随意定制的,而且这些 PSD 分层素材文件组 ...
- JAVA 设计模式 模板方法模式
定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...
- Auto Mapper04(MVC中的配置)
学习如何在MVC项目中配置AutoMapper. 一:首先在MVC项目中引用AutoMapper的DLL文件,接着创建一个接口,这里面我们需要定义两个方法,接口里面的方法只能定义不能实现,也没有什么修 ...
- a:link a:visited a:hover a:active四种伪类选择器的区别
a:link选择网页中所有没有被visited的a标签,就是没有鼠标悬停hover或者点击click(a链接没有被访问时的样式) a:visited选择网页中所有已经被click的a链接,用来告诉用户 ...
- LeetCode - Binary Tree Level Order Traversal II
题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...
- Sublime Text2配置过程
今天Sublime Text2不知道为什么突然崩溃了,一直不能运行,没办法只有重装了,重装后按我的用途重新配置了一下,现将配置过程记录下来以备将来不时之需 说明:配置是在windows系统上进行的,其 ...
- .Net实现拉勾网爬虫
前几天看到一个.NET Core写成的爬虫,有些莫名的小兴奋,之前一直用集搜客去爬拉勾网的招聘信息,这个傻瓜化工具相当于用HTML模板页去标记DOM节点,然后在浏览器窗口上模拟人的浏览行为同时跟踪节点 ...
- SQL_递归查询(复杂查询示例)
需求: 一篇文章里有很多评论,每个评论又有很多回复评论,要求: 页面将文章展示出来,且文章的主评论按照评论时间分页展示,回复评论的评论完全展示在每个主评论下面,且按照回复时间排序 最终查询结果SQL查 ...
- IT技术开发人员获得成功的六大步骤
IT技术开发人士成功的6大步骤 一个前辈在移民加拿大后写的文章,写得不错,值得借鉴,转来给大家看看,也给自己 序言:经过001多年的洗礼,认识了这里这么多的JJMMGGDD,前几天刚得到签证, 无 ...
- PHP程序员7小时学会Kotlin系列
这是我尝试给自己一个目标去学会一门新语言的方法.正在创作中,敬请期待! 提纲 第一小时 概念 第二小时 基础 第三小时 函数 第四小时 类与对象 第五小时 类与对象二 第六小时 DSL 第七小时 工程 ...