需求:将一个手机上的通话记录进行读取,备份;之后在另一部手机上进行通话记录的恢复,要求恢复模式是添加模式,不能覆盖新手机上的通话记录。
解决方案:
备份:
1.获取手机A上的通话记录数据
2.将数据进行备份,即以xml格式输出到SD卡
恢复:
1.读取并解析SD卡中xml格式的备份数据,输出是一个List
2.以ContentValue的格式插入到手机B的数据库中
一.备份
1.首先先把代码贴出来:
(1)main.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:id="@+id/LinearLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/backup_button"
android:text="start backup" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/restore_button"
android:text="start restore" />
</LinearLayout>
(2)Activity
public CallLogActivity extends Activity{
private Button backupButton;
private Button restoreButton;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
backupButton = (Button)findViewById(R.id.backup_button);
restoreButton = (Button)findViewById(R.id.restore_button);
backupButton.setOnClickListener(new ClickListner());
restoreButton.setOnClickListener(new ClickListner());
}
class ClickListner implements View.OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId){
case R.id.backup_button:
CallLogAsyncTask clTask = new CallLogAsyncTask();
clTask.excute(true);
break;
case R.id.restore_button:
CallLogAsyncTask clTask = new CallLogAsyncTask();
clTask.excute(false);
break;
default:
break;
}
}
class CallLogAsyncTask extends AsyncTask<Boolean, Integer, Boolean>{
public CallLogAsyncTask(){
}
@Override
protected Boolean doInBackground(Boolean... params) {
// TODO Auto-generated method stub
boolean isBackup = params[0];
if(isBackup){
return backupTask();
}
return restoreTask();
}
protected boolean backupTask(){
XmlCreateUtils xcu = new XmlCreateUtils(XmlCreateUtils.getCallLogInfos(CallLogActivity.this));
String xmlStr = xcu.createXmlFile("call_log_root", "call_log_option");
return xcu.outStreamXmlStrToFile(xmlStr);
}
protected boolean restoreTask(){
}
}
}
(3)Utils类
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import java.io.StringWriter;
public class XmlCreateUtils {
private final String ID = "_id";
private final String NAME = "name";
private final String NUMBER = "number";
private final String DATE = "date";
private final String DURATION = "duration";
private final String TYPE = "type";
private final String NEW = "new";
private StringWriter mXmlWriter;
private XmlPullParserFactory mPullParserFactory;
private XmlSerializer mXmlSerializer;
private ArrayList<HashMap<String, String>> mCallLogInfoList;
public XmlCreateUtils(ArrayList<HashMap<String, String>> callLogInfoList)
throws XmlPullParserException, IllegalArgumentException, IllegalStateException, IOException {
// TODO Auto-generated constructor stub
mCallLogInfoList callLogInfoList;
mXmlWriter = new StringWriter();
mPullParserFactory = XmlPullParserFactory.newInstance();
mXmlSerializer = pullParserFactory.newSerializer();
mXmlSerializer.setOutput(mXmlWriter);
}
public String createXmlFile(String rootStartTag, String optionStartTag){
try{
//<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
mXmlSerializer.startDocument("UTF-8", true);
// <rootStartTag number="25">
mXmlSerializer.startTag("", rootStartTag);
mXmlSerializer.attribute("", "number", String.valueOf(mCallLogInfoList.size()));
for(HashMap<String, String> callLogInfoMap : mCallLogInfoList){
// <optionStartTag>
mXmlSerializer.startTag("", optionStartTag);
createXmlOptions(callLogInfoMap);
// </optionStartTag>
mXmlSerializer.endTag("", optionStartTag);
}
// </rootStartTag>
mXmlSerializer.endTag("", rootStartTag);
mXmlSerializer.endDocument();
}catch(Exception e){
e.printStackTrace();
return null;
}
return mXmlWriter.toString();
}
private void createXmlOptions(HashMap<String, String> callLogInfoMap)
throws IllegalArgumentException, IllegalStateException, IOException {
// TODO Auto-generated method stub
// <_id>value</_id>
mXmlSerializer.startTag("", ID);
mXmlSerializer.text(callLogInfoMap.get(ID));
mXmlSerializer.endTag("", ID);
// <name>value</name>
mXmlSerializer.startTag("", NAME);
mXmlSerializer.text(callLogInfoMap.get(NAME));
mXmlSerializer.endTag("", NAME);
// <number>value</number>
mXmlSerializer.startTag("", NUMBER);
mXmlSerializer.text(callLogInfoMap.get(NUMBER));
mXmlSerializer.endTag("", NUMBER);
// <date>value</date>
mXmlSerializer.startTag("", DATE);
mXmlSerializer.text(callLogInfoMap.get(DATE));
mXmlSerializer.endTag("", DATE);
// <duration>value</duration>
mXmlSerializer.startTag("", DURATION);
mXmlSerializer.text(callLogInfoMap.get(DURATION));
mXmlSerializer.endTag("", DURATION);
// <type>value</type>
mXmlSerializer.startTag("", TYPE);
mXmlSerializer.text(callLogInfoMap.get(TYPE));
mXmlSerializer.endTag("", TYPE);
// <new>value</new>
mXmlSerializer.startTag("", NEW);
mXmlSerializer.text(callLogInfoMap.get(NEW));
mXmlSerializer.endTag("", NEW);
}
public int outStreamXmlStrToFile(String callLogInfoStr, String path, String fileName){
// TODO Auto-generated method stub
boolean b = false;
OutputStream outStream = null;
OutputStreamWriter outStreamWriter = null;
try {
if( MEDIA_MOUNTED != Environment.getExternalStorageState()){
Log.i("TAG", "SD is not exist!!");
return false;
}
final String sdPath = Environment.getExternalStorageDirectory();
String backupFileStr = sdPath + "/backup/" + fileName;
File backupFile = new File(backupFileStr);
File backupDir = new File(sdPath + "/backup");
if(!backupDir.exist() || !backupDir.isDirectory()){
backupDir.mkdirs();
}
if(!backupFile.exist){
backupFile.createFile();
}
outStream = new FileOutputStream(backupFile, true);
outStreamWriter = new OutputStreamWriter(outStream);
outStreamWriter.write(callLogInfoStr);
outStreamWriter.close();
b = true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try{
if(outStream != null){
outStream.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return b;
}
public static ArrayList<HashMap<String, String>> getCallLogInfos(Context context) {
final String[] PROJECT= new String[]{
"_id", // 0
"name", // 1
"number", // 2
"date", // 3
"duration", // 4
"type", // 5
"new" // 6
};
final Uri CONTENT_URI = Uri.parse("content://call_log/calls");
final ContentResolver resolver = context.getContentResolver();
final Cursor cursor = resolver.query(CONTENT_URI, PROJECT, null, null, null, null);
ArrayList<HashMap<String, String>> callLogInfoList = new ArrayList<HashMap<String, String>>();
if(null == cursor || cursor.getCount() == 0){ return null; }
cursor.moveToFirst();
do{
HashMap<String, String> callLogInfoMap = new HashMap<String, String>();
callLogInfoMap.put("_id", cursor.getString(0));
callLogInfoMap.put("name", cursor.getString(1));
callLogInfoMap.put("number", cursor.getString(2));
callLogInfoMap.put("date", cursor.getString(3));
callLogInfoMap.put("duration", cursor.getString(4));
callLogInfoMap.put("type", cursor.getString(5));
callLogInfoMap.put("new", cursor.getString(6));
callLogInfoList.add(callLogInfoMap);
}while(cursor.moveToNext());
if(cursor != null){ cursor.close(); }
return callLogInfoList;
}
}
2.代码简要说明:
通过getCallLogInfos()方法获取CallLogInfoList;
采用pull方式构建xml字符串;
通过outStreamXmlStrToFile()方法将字符串输出到SD卡,完成备份。