Android项目实战--手机卫士19--短信的恢复
好,我们上一次讲了那个短信的备份的,既然有备份,那肯定也要有个还原的啦,今天我们就把那个还原的做一下
其实很简单的,就是把我们上一次备份的xml解析出来,然后写回到数据库里面而已
我们现在就开始写代码,先在上一次的com.xiaobin.security.engine.SmsService里面增加一个方法
package com.xiaobin.security.engine;import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.app.ProgressDialog;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.util.Xml;import com.xiaobin.security.domain.SmsInfo;public class SmsService{private Context context;public SmsService(Context context){this.context = context;}public List<SmsInfo> getSmsInfo(){List<SmsInfo> infos = new ArrayList<SmsInfo>();ContentResolver resolver = context.getContentResolver();Uri uri = Uri.parse("content://sms/");Cursor cursor = resolver.query(uri, new String[] {"_id", "address", "date", "type", "body"}, null, null, " date desc ");SmsInfo info;while(cursor.moveToNext()){info = new SmsInfo();String id = cursor.getString(0);String address = cursor.getString(1);String date = cursor.getString(2);int type = cursor.getInt(3);String body = cursor.getString(4);info.setId(id);info.setAddress(address);info.setDate(date);info.setType(type);info.setBody(body);infos.add(info);}cursor.close();return infos;}//还原短信 path为文件路径public void restore(String path, ProgressDialog pd) throws Exception{File file = new File(path);FileInputStream fis = new FileInputStream(file);XmlPullParser parser = Xml.newPullParser();ContentValues values = null;parser.setInput(fis, "utf-8");int type = parser.getEventType();int index = 0;while(type != XmlPullParser.END_DOCUMENT){switch(type){case XmlPullParser.START_TAG : if("count".equals(parser.getName())){int count = Integer.parseInt(parser.nextText());pd.setMax(count);}if("sms".equals(parser.getName())){values = new ContentValues();}else if("address".equals(parser.getName())){values.put("address", parser.nextText());}else if("date".equals(parser.getName())){values.put("date", parser.nextText());}else if("type".equals(parser.getName())){values.put("type", parser.nextText());}else if("body".equals(parser.getName())){values.put("body", parser.nextText());}break;case XmlPullParser.END_TAG : if("sms".equals(parser.getName())){ContentResolver resolver = context.getContentResolver();resolver.insert(Uri.parse("content://sms/"), values);values = null;index++;pd.setProgress(index);}break;default : break;}type = parser.next();}}}
现在恢复短信的方法就写好啦,我们现在就要回到com.xiaobin.security.ui.AToolActivity这个类里面了,为短信恢复这个条目添加相应的事件还有方法啦
因为短信恢复是一个非常耗时的操作,所以我们就开启一个线程来运行它的
com.xiaobin.security.ui.AToolActivity
package com.xiaobin.security.ui;import java.io.File;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.graphics.Color;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.TextView;import android.widget.Toast;import com.xiaobin.security.R;import com.xiaobin.security.engine.DownloadTask;import com.xiaobin.security.engine.SmsService;import com.xiaobin.security.service.AddressService;import com.xiaobin.security.service.BackupSmsService;public class AToolActivity extends Activity implements OnClickListener{private static final int ERROR = 0;private static final int SUCCESS = 1;private TextView tv_atool_query;private TextView tv_atool_number_service_state;private CheckBox cb_atool_state;private TextView tv_atool_select_bg;private TextView tv_atool_change_location;private TextView tv_atool_number_security;private TextView tv_atool_sms_backup;private TextView tv_atool_sms_restore;private Intent serviceIntent;private ProgressDialog pd;private SharedPreferences sp;@SuppressLint("HandlerLeak")private Handler handler = new Handler(){public void handleMessage(Message msg) {switch(msg.what){case ERROR : Toast.makeText(AToolActivity.this, "下载数据库失败,请检查网络!", Toast.LENGTH_SHORT).show();break;case SUCCESS : Toast.makeText(AToolActivity.this, "数据库下载成功!", Toast.LENGTH_SHORT).show();break;default : break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.atool);sp = getSharedPreferences("config", Context.MODE_PRIVATE);tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);tv_atool_query.setOnClickListener(this);tv_atool_select_bg = (TextView) findViewById(R.id.tv_atool_select_bg);tv_atool_select_bg.setOnClickListener(this);tv_atool_change_location = (TextView) findViewById(R.id.tv_atool_change_location);tv_atool_change_location.setOnClickListener(this);tv_atool_number_security = (TextView) findViewById(R.id.tv_atool_number_security);tv_atool_number_security.setOnClickListener(this);tv_atool_sms_backup = (TextView) findViewById(R.id.tv_atool_sms_backup);tv_atool_sms_backup.setOnClickListener(this);tv_atool_sms_restore = (TextView) findViewById(R.id.tv_atool_sms_restore);tv_atool_sms_restore.setOnClickListener(this);tv_atool_number_service_state = (TextView) findViewById(R.id.tv_atool_number_service_state);cb_atool_state = (CheckBox) findViewById(R.id.cb_atool_state);serviceIntent = new Intent(this, AddressService.class);cb_atool_state.setOnCheckedChangeListener(new OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked){if(isChecked){startService(serviceIntent);tv_atool_number_service_state.setTextColor(Color.BLACK);tv_atool_number_service_state.setText("归属地服务已开启");}else{stopService(serviceIntent);tv_atool_number_service_state.setTextColor(Color.RED);tv_atool_number_service_state.setText(R.string.number_service_state);}}});}@Overridepublic void onClick(View v){switch(v.getId()){case R.id.tv_atool_query : query();break;case R.id.tv_atool_select_bg : selectStyle();break;case R.id.tv_atool_change_location : Intent intent = new Intent(this, DragViewActivity.class);startActivity(intent);break;case R.id.tv_atool_number_security : Intent i = new Intent(this, NumberSecurityActivity.class);startActivity(i);break;case R.id.tv_atool_sms_backup : Intent backupIntent = new Intent(this, BackupSmsService.class);startService(backupIntent);break;case R.id.tv_atool_sms_restore : restore();break;default : break;}}private void query(){if(isDBExist()){Intent intent = new Intent(this, QueryNumberActivity.class);startActivity(intent);}else{//提示用户下载数据库pd = new ProgressDialog(this);pd.setMessage("正在下载数据库...");pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setCancelable(false);pd.show();new Thread(){public void run() {String path = getResources().getString(R.string.serverdb);File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");if(!dir.exists()){dir.mkdirs();}String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";try{//这个类,我们在做更新apk的时候已经写好的啦,现在直接拿过来用就可以啦DownloadTask.getFile(path, dbPath, pd);pd.dismiss();}catch (Exception e){e.printStackTrace();pd.dismiss();Message message = new Message();message.what = ERROR;handler.sendMessage(message);}};}.start();}}private boolean isDBExist(){if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");if(file.exists()){return true;}}return false;}private void selectStyle(){AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("归属地显示风格");String[] items = new String[] {"半透明", "活力橙", "苹果绿", "孔雀蓝", "金属灰"};builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){Editor editor = sp.edit();editor.putInt("background", which);editor.commit();}});builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){}});builder.create().show();}private void restore(){final ProgressDialog pd = new ProgressDialog(this);pd.setTitle("还原短信");pd.setMessage("正在还原短信...");pd.setCancelable(false);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.show();final SmsService smsService = new SmsService(this);new Thread(){public void run() {try{smsService.restore(Environment.getExternalStorageDirectory() + "/security/backup/smsbackup.xml", pd);pd.dismiss();Looper.prepare();//创建一个LooperToast.makeText(getApplicationContext(), "还原成功", Toast.LENGTH_SHORT).show();Looper.loop();//轮循一次Looper}catch (Exception e){e.printStackTrace();Looper.prepare();//创建一个LooperToast.makeText(getApplicationContext(), "还原失败", Toast.LENGTH_SHORT).show();Looper.loop();//轮循一次Looper}}}.start();}}
今天源码下载