【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格式的文件存放起来了。
短信的备份也就完成了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。