Android之通话记录的查询、删除与插入(1)

需求:将一个手机上的通话记录进行读取,备份;之后在另一部手机上进行通话记录的恢复,要求恢复模式是添加模式,不能覆盖新手机上的通话记录。

解决方案:

备份:

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卡,完成备份。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值