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();
}