首页 > 代码库 > 【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基础篇】利用内容提供者实现短信备份
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。