为了避免重要信息删除后无法挽回的局面,目前很多Android应用都实现了短信的备份操作。短信备份,其实就是从短信应用中读取短信,然后将短信数据写入XML文件的过程。但这里会涉及到两个问题:
第一:如何从短信应用中读取短信
第二:如何将短信数据写入XML文件
系统存储短信内容的目录为/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们可以通过Eclipse找到对应的数据库文件,具体如图1所示。
点击File Explorer右上角标注的那个按钮,将数据库导出,然后使用SQLite Expert Personal打开查看短信数据的存储结构,如图2所示。 从图2中可以看出,用于存放短信的表有很多字段,其中,address字段表示接受短信的号码,body表示短信内容,date表示短信发送的时间。 但是,mmssms.db 文件对于第三方而言,是不可读不可写的,所以,我们要想在程序中访问短信内容,需要使用内容提供者。 Android提供了许多自带的内容提供者给开发者使用,这些内容提供者给我们提供了一些系统数据供我们访问,通过查看短信内容提供者的源码我们可以得到以下内容。 查看清单配置文件源码得到短信内容提供者的主机名为:sms
- <provider android:name="SmsProvider"
- android:authorities="sms"
- android:multiprocess="false"
- android:exported="true"
- android:readPermission="android.permission.READ_SMS"
- android:writePermission="android.permission.WRITE_SMS"/>
复制代码查看 SmsProvider系统短信内容提供者类得到以下内容,即当uri匹配上content://sms/则可调用query方法,查询短信数据库,即sms表。- //系统短信内容提供者类
- public class SmsProvider extends ContentProvider{
- ...
- static {
- /**
- 维护主机名后,维护短信数据库中指定短信表的访问方式,null则在说明在主机名后不需要
- 拼接后续内容,则为content://sms/
- */
- sURLMatcher.addURI("sms", null, SMS_ALL);
- }
- ...
- //源码查询数据方法,此方法中包含查询短信数据
- public Cursor query(Uri url, String[] projectionIn, String selection,
- String[] selectionArgs, String sort){
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- /**
- 如果参数url和sURLMatcher.addURI("sms", null, SMS_ALL)的url一致,
- 则匹配其返回值,即SMS_ALL
- */
- int match = sURLMatcher.match(url);
- switch (match) {
- case SMS_ALL:
- //指定查询表名为sms
- constructQueryForBox(qb, Sms.MESSAGE_TYPE_ALL);
- break;
- }
- //做查询操作,返回查询所有短信表的游标
- SQLiteDatabase db = mOpenHelper.getReadableDatabase();
- Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,null, null,
- orderBy);
- return ret;
- }
- ...
- }
复制代码设置查询表名, TABLE_SMS常量的值就是 sms表名- //设置查询表名,TABLE_SMS常量的值就是sms表名
- private void constructQueryForBox(SQLiteQueryBuilder qb, int type) {
- qb.setTables(TABLE_SMS);
- }
复制代码编写查询短信数据,并且备份至 xml的方法backup- // 1.获取xml序列化器
- XmlSerializer serializer = Xml.newSerializer();
- // 2.将文件存储至sd卡中,并且将短信备份至sd卡的backup.xml中
- File file = new File(Environment.getExternalStorageDirectory().getPath(),
- backup.xml");
- FileOutputStream fos = new FileOutputStream(file);
- serializer.setOutput(fos, "utf-8");
- // 3. 写xml文档开头
- serializer.startDocument("utf-8", true);
- // 4 写根节点
- serializer.startTag(null, "smss");
- // 5 通过内容解析器,匹配uri,获取系统短信数据库中短信表中数据
- Uri uri = Uri.parse("content://sms/");
- Cursor cursor = getContentResolver().query(uri,
- new String[] { "address", "body", "date" }, null, null,null);
- while (cursor.moveToNext()) {
- serializer.startTag(null, "sms");
- serializer.startTag(null, "address");
- serializer.text(cursor.getString(0));
- serializer.endTag(null, "address");
- serializer.startTag(null, "body");
- serializer.text(cursor.getString(1));
- serializer.endTag(null, "body");
- serializer.startTag(null, "date");
- serializer.text(cursor.getString(2));
- serializer.endTag(null, "date");
- serializer.endTag(null, "sms");
- }
- serializer.endTag(null, "smss");
- serializer.endDocument();
复制代码
|