备份短信
义务方法里面有异常,且没有返回值,是一个void,那么异常必须抛出去。 | |
一、备份短信 步骤: 1、利用短信的内容提供者来获取短信的内容,短信的内容提供者,定义如下 \packages\providers\TelephonyProvider\AndroidManifest.xml <provider android:name="SmsProvider"
android:authorities="sms"
android:multiprocess="true"
android:exported="true"
android:readPermission="android.permission.READ_SMS"
android:writePermission="android.permission.WRITE_SMS" /> 2、查看系统源码的uri定义
3、查看短信数据库\data\data\com.android.providers.telephony\databases\mmssms.db
4、权限:
5、备份短信是一个耗时的操作,应该将其放在子线程里面进行 6、ProgressDialog进度对话框的使用 // 需求1、进度对话框
final ProgressDialog progressDialog = new ProgressDialog(this);
// a) 设置进度对话框的参数
progressDialog.setTitle("提醒:");
progressDialog.setMessage("正在备份短信~~~");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// b)显示进度对话框,一定要
progressDialog.show();
//由于没有开启子线程,所以要等备份完毕后,才能显示出来进度对话框完成,且备份过程很慢,不应该放在主线程里面,应该放在子线程里面
progressDialog.setMax(total);
progressDialog.setProgress(progress);
progressDialog.dismiss();
7、ProgressBar进度条 8、XmlSerializer备份短信到xml文件 9、回调函数 A:写界面的 B:写工具类的 如果一下需求 需求1:进度对话框
需求2:进度条
那此时,B需要不断的修改他所写的工具类 解决:B可以定义接口,在其接口中定义要调用的方法,并提供一个接口出去,他的代码里面只调用接口中的方法,如果A实现了接口中的方法,即使A中变化了,B也不需要改变其源程序。 |
|
核心代码: AdvancedToolsActivity.java package cn.zengfansheng.mobilesafe;
import java.io.IOException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ProgressBar;
import cn.zengfansheng.mobilesafe.utils.SmsUtils;
import cn.zengfansheng.mobilesafe.utils.SmsUtils.BackupCallback;
import cn.zengfansheng.mobilesafe.utils.ToastUtils;
/**
* 11、高级工具Activity
*
* @author hacket
*
*/
public class AdvancedToolsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_advanced_tools);
}
/**
* 1、查询手机号码、固话归属地-离线查询
*
* @param view
*/
public void queryNumberAddress(View view) {
Intent intent = new Intent(this, NumberQueryActivity.class);
startActivity(intent);
}
/**
* 2、常见热线号码查询
*
* @param view
*/
public void queryCommonNumber(View view){
Intent intent = new Intent(this, CommnumNumberActivity.class);
startActivity(intent);
}
/**
* 3、短信备份
* @param view
*/
public void backupSms(View view){
String externalStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(externalStorageState)) {
// 需求1、进度对话框
final ProgressDialog progressDialog = new ProgressDialog(this);
// a) 设置进度对话框的参数
progressDialog.setTitle("提醒:");
progressDialog.setMessage("正在备份短信~~~");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// b)显示进度对话框,一定要
progressDialog.show();
// 由于没有开启子线程,所以要等备份完毕后,才能显示出来进度对话框完成,且备份过程很慢,不应该放在主线程里面,应该放在子线程里面
// 需求2、进度条
final ProgressBar progressBar = (ProgressBar) this.findViewById(R.id.pb_backup_sms);
progressBar.setVisibility(ProgressBar.VISIBLE);// 进度条可见
new Thread() {
public void run() {
try {
String path = Environment.getExternalStorageDirectory()+"/smsbackup.xml";
// SmsUtils.backupSms(AdvancedToolsActivity.this, path, progressDialog); //需求1:进度对话框
// SmsUtils.backupSms(AdvancedToolsActivity.this, path,pb_backup);//需求2:进度条
// 回调函数,这里实现,定义回调的地方调用
SmsUtils.backupSms(AdvancedToolsActivity.this, path, new BackupCallback() {
@Override
public void beforeBackup(int total) {
//需求1:进度对话框
progressDialog.setMax(total);
//需求2: 进度条
progressBar.setMax(total);
}
@Override
public void onBackupProcess(int progress) {
//需求1:进度对话框
progressDialog.setProgress(progress);
//需求2: 进度条
progressBar.setProgress(progress);
}
});
ToastUtils.showToastInThread(AdvancedToolsActivity.this, "备份短信成功~~~" + path);
} catch (IllegalArgumentException e) {
e.printStackTrace();
ToastUtils.showToastInThread(AdvancedToolsActivity.this, "备份短信失败~~~");
} catch (IllegalStateException e) {
e.printStackTrace();
ToastUtils.showToastInThread(AdvancedToolsActivity.this, "备份短信失败~~~");
} catch (IOException e) {
e.printStackTrace();
ToastUtils.showToastInThread(AdvancedToolsActivity.this, "备份短信失败~~~");
} catch (InterruptedException e) {
e.printStackTrace();
ToastUtils.showToastInThread(AdvancedToolsActivity.this, "备份短信失败~~~");
} finally {
// 1、将进度对话框dismiss
progressDialog.dismiss();
// 2、进度条不可见 FIXME
// progressBar.setVisibility(ProgressBar.INVISIBLE);
//Only the original thread that created a view hierarchy can touch its views.
}
};
}.start();
}
}
/**
* 4、短信恢复
* @param view
*/
public void restoreSms(View view) {
}
}
SmsUtils.java 回调函数
|
|
问题1:异常: | 11-07 16:01:57.159: E/AndroidRuntime(31528): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. |
问题2: 对于备份的短信,如果使用明文备份,不安全,应该使用密文加密。 简单的加密算法: 加密:定义一个密码,然后将该密码与源数据进行异或操作,得到一个密文 解密:再用这个密码和密文进行一次异或,又重新得明文 更深层次: 可以将高四位和低四位进行交换。 |