1.创建读取短信的一个工具类,读取系统短信序列化到SDcard下的xml文件下
2.smsUtils提供一个接口,接口内提供两个回调函数, 将接口作为参数传给工具类
3.在activity中调用dao层内的方法,重写借口内的回调函数,得到短信的总数和序列化短信的条数
---------------------------------------------------------------------------------------------------------------------------
1.创建读取短信的一个工具类,读取系统短信序列化到SDcard下的xml文件下
2.smsUtils提供一个接口,接口内提供两个回调函数, 将接口作为参数传给工具类
/**
* 备份短信工具类
*
@author
Administrator
*
*/
public
class
SmsUtils {
/**
* 得到总共需要 备份多少条短信的条数,和当前备份了多少条短信的条数的接口
*
@author
Administrator
*
*/
public
interface
BackupCallback{
/**
* 在备份短信之前调用的方法
*
@param
total 一共有多少个短信需要备份
*/
public
void
beforeBackup(
int
total); //把total传给调用类
/**
* 在短信备份的过程中调用的方法
*
@param
process 当前已经备份了多少条的数据
*/
public
void
onBackupProcess(
int
process); //把process传给调用类
}
private
static
final
String
TAG
=
"SmsUtils"
;
public
static
void
backupSms(Context context,String path,BackupCallback callback)
throws
Exception{
//读取系统短信序列化到 sd卡中的xml文件上
XmlSerializer serializer = Xml. newSerializer();
File file=
new
File(path);
FileOutputStream fos=
new
FileOutputStream(file);
serializer.setOutput(fos,
"UTF-8"
);
//创建内容解析这读取系统短信内容
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(Uri.parse(
"content://sms/"
),
new
String[]{
"address"
,
"date"
,
"type"
,
"body"
},
null
,
null
,
null
);
int
total = cursor.getColumnCount();
//得到数据库有多少条数据
Log. i(
TAG
,
"总共有"
+total+
"条短信"
);
callback.beforeBackup(total);
//总共需要备份多少条短信
//系列化系统短信到 xml文件上
serializer.startDocument(
"UTF-8"
,
true
);
serializer.startTag(
null
,
"smss"
);
int
process=0;
while
(cursor.moveToNext()){
serializer.startTag(
null
,
"sms"
);
serializer.startTag(
null
,
"address"
);
serializer.text(cursor.getString(0));
serializer.endTag(
null
,
"address"
);
serializer.startTag(
null
,
"date"
);
serializer.text(cursor.getString(1));
serializer.endTag(
null
,
"date"
);
serializer.startTag(
null
,
"type"
);
serializer.text(cursor.getString(2));
serializer.endTag(
null
,
"type"
);
serializer.startTag(
null
,
"body"
);
serializer.text(cursor.getString(3));
serializer.endTag(
null
,
"body"
);
serializer.endTag(
null
,
"sms"
);
fos.flush();
process++;
callback.onBackupProcess(process);
//当前备份了多少条数据
}
serializer.endTag(
null
,
"smss"
);
serializer.endDocument();
//关闭资源
cursor.close();
fos.close();
}
}
-------------------------------------------------------------------------------------------------------------------------------------
3.在activity中调用dao层内的方法,重写借口内的回调函数,得到短信的总数和序列化短信的条数
/**
* 短信的备份
*
@param
v
*/
private
ProgressDialog
pd
;
//声明进度条对话框
private
ProgressBar
pb_progress
;
public
void
backupSms(View v){
Log.i(
TAG
,
"备份短信......."
);
//获取并判断手机的SD卡状态
String state = Environment. getExternalStorageState();
if
(!Environment.
MEDIA_MOUNTED
.equals(state)){
Toast. makeText(getApplicationContext(),
"SD卡不存在"
, 0).show();
return
;
}
//创建进度条对话框
pd
=
new
ProgressDialog(
this
);
pd
.setTitle(
"提醒:"
);
pd
.setMessage(
"正在备份短信"
);
pd
.setProgressStyle(ProgressDialog.
STYLE_HORIZONTAL
);
pd
.show();
//找到进度条控件
pb_progress
=(ProgressBar) findViewById(R.id.
pb_progress
);
//在子线程中进行耗时操作
new
Thread(){
public
void
run() {
Log. i(
TAG
,
"备份短信"
);
//在SD卡下创建xml文件
File file=
new
File(Environment.getExternalStorageDirectory(),
"sms.xml"
);
//调用短信备份工具类
try
{
SmsUtils. backupSms(getApplicationContext(), file.getAbsolutePath(),
new
BackupCallback(){
@Override
public
void
beforeBackup(
int
total) {
//进度条最大值
pd
.setMax(total);
pb_progress
.setMax(total);
}
@Override
public
void
onBackupProcess(
int
process) {
//进度条进度
pd
.setProgress(process);
pb_progress
.setProgress(process);
}
});
ToastUtils. showToastInThread(AtoolsActivity.
this
,
"备份成功"
);
pd
.dismiss();
//关闭进度条对话框
}
catch
(Exception e) {
e.printStackTrace();
ToastUtils. showToastInThread(AtoolsActivity.
this
,
"备份失败"
);
}
}
}.start();
}