首页 > 代码库 > 【android基础篇】利用内容提供者实现短信备份

【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格式的文件存放起来了。
短信的备份也就完成了。

 

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