【android基础篇】利用内容提供者实现短信备份

I,准备工作

系统存储短信内容的目录为:/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们找到对应的数据库文件。

我们可以发现该文件对于第三方而言,是不可读不可写的,这里则必须要使用内容提供者。

问题就来了:我不知道主机名,也就无法作为中间人去找证监会打探消息。其实,完全没有关系,我们可以翻阅安卓的源代码:

\packages\providers\TelephonyProvider的清单文件,因为主机名都配置在清单文件上的,通过翻阅,我们查到了我们所需要的信息:

1    <provider android:name="SmsProvider"
2                   android:authorities="sms"
3                   android:multiprocess="true"
4                   android:readPermission="android.permission.READ_SMS"
5                   android:writePermission="android.permission.WRITE_SMS" />

主机名为:“sms”,其中它还添加了两个权限,所以我们还需要为工程添加读写短信的权限。

找到主机名还不够,因为我们还需要它的匹配规则,那这样就很容易找了,直接找到SmsProvider.java中的静态代码块中查看匹配的规则:

1  static {
2         sURLMatcher.addURI("sms", null, SMS_ALL);
3         sURLMatcher.addURI("sms", "#", SMS_ALL_ID);
4          ...........................    
5         }

第一行表示的意思就是,主机名后为null时,表示匹配所有短信。

也就是说:content://sms表示匹配所有短信。

 

II,获取短信内容

在布局文件中设置一个按钮,并在按钮的点击事件中,获取短信。

 1 public void backup(View view){
 2         //设置路径
 3         Uri uri=Uri.parse("content://sms");
 4         /**
 5          * 我要实现的功能是读短信,首先得到中间人
 6          */
 7         ContentResolver resolver=getContentResolver();
 8         /**
 9          * projection表示的是查询的列
10          */
11         Cursor cursor=resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
12 }
ContentResolver resolver=getContentResolver();是得到中间人。
然后中间人就拿着地址去查询短信的数据库,而接下来的步骤就是利用游标来获取短信的内容。
 1 List<SmsInfo> list=new ArrayList<SmsInfo>();
 2         while(cursor.moveToNext()){
 3             String address=cursor.getString(0);
 4             String date=cursor.getString(1);
 5             String type=cursor.getString(2);
 6             String body=cursor.getString(3);
 7             SmsInfo sms=new SmsInfo(address, date, type, body);
 8             list.add(sms);
 9         }
10         SmsManager.open(list,this);

SmsInfo是javabean,利用它将我们想要的数据,短信的address(发送人),date(发送的时间),type(短信的类型),body(短信的内容)封装到bean中。

最后用存放在List集合中。而SmsManager是一个工具类,可以把集合中的数据输出为xml文件。

下面附上SmsManager的代码:

 1 public static void open(List<SmsInfo> list,Context context){
 2         /**
 3          * pull解析输出xml文件
 4          */
 5         try {
 6             XmlSerializer serializer=Xml.newSerializer();
 7             File file=new File(Environment.getExternalStorageDirectory().getPath()+"/backup.xml");
 8             FileOutputStream fos=new FileOutputStream(file);
 9             
10             serializer.setOutput(fos, "utf-8");
11             
12             serializer.startDocument("utf-8", true);
13             serializer.startTag(null, "smss");
14             for(SmsInfo sms:list){
15                 serializer.startTag(null, "sms");
16                 
17                 serializer.startTag(null, "address");
18                 serializer.text(sms.getAddress());
19                 serializer.endTag(null, "address");
20                 
21                 serializer.startTag(null, "date");
22                 serializer.text(sms.getDate());
23                 serializer.endTag(null, "date");
24                 
25                 serializer.startTag(null, "type");
26                 serializer.text(sms.getType());
27                 serializer.endTag(null, "type");
28                 
29                 serializer.startTag(null, "body");
30                 serializer.text(sms.getBody());
31                 serializer.endTag(null, "body");
32                 
33                 serializer.endTag(null, "sms");
34             }
35             serializer.endTag(null, "smss");
36             serializer.endDocument();
37             fos.close();
38             Toast.makeText(context, "serializer方式输出xml成功!", 0).show();
39         } catch (Exception e) {
40             Toast.makeText(context, "抛出异常", 0).show();
41             e.printStackTrace();
42         }
43     }

最后短信的内容就以xml格式的文件存放起来了。
短信的备份也就完成了。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。