最新實戰教程,讓你瞭解Android自動化刷量、作弊與防作弊的那些事,案例:刷友盟統計、批量註冊蘋果帳號
好,我們上一次講了那個短信的備份的,既然有備份,那肯定也要有個還原的啦,今天我們就把那個還原的做一下
其實很簡單的,就是把我們上一次備份的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;
}
}
};
@Override
protected 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()
{
@Override
public 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);
}
}
});
}
@Override
public 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()
{
@Override
public 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()
{
@Override
public 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();//創建一個Looper
Toast.makeText(getApplicationContext(), "還原成功", Toast.LENGTH_SHORT).show();
Looper.loop();//輪循一次Looper
}
catch (Exception e)
{
e.printStackTrace();
Looper.prepare();//創建一個Looper
Toast.makeText(getApplicationContext(), "還原失敗", Toast.LENGTH_SHORT).show();
Looper.loop();//輪循一次Looper
}
}
}.start();
}
}
好啦,恢復短信的操作到這裏,也完成啦