在Android应用中读取彩信文件涉及到Android的一个数据库/data/data /com.android.providers.telephony/databases/mmssms.db和一个文件夹/data/data /com.android.providers.telephony/app_parts。要备份彩信,可以将这个数据库和文件夹拷贝到硬盘,但是在应用 中却不能通过openDatabase系列方法来读这个数据库,也不能通过直接打开文件来读取附件文件,因为你的应用不是它们的所有者,不能直接读取,而 要使用ContentProvider来读取。

1、读取mmssms.db数据库

彩信的标题、发送者号码、日期等数据存储在mmssms.db的pdu表中,要读取这个表可以使用系统提供的一个ContentProvider,URI 是“content://mms”。操作这个ContentProvider和操作数据库一样,这个ContentProvider的结构也和pdu表的 结构一样,Android文档对这些字段没有说明,但是可以通过将mmssms.db数据库备份到硬盘上,然后再通过Sqlite Database Browser软件来查看分析,具体可参考:http://www.blogjava.net/easywu/archive/2010/01/10 /308959.html。
content://mms主要的几个字段如下:
◆ _id:该条彩信的主键,对应着part表(ContentProvider的URI是content://mms/part,详见后)中的mid字段。
◆sub:该条彩信的标题
◆date:该条彩信的接收日期
下面的代码可以查询该CotnetProvider,得到一个cursor,并列出所有的列名。

Java代码
  1. Cursorcur=getContentResolver().query(Uri.parse( "content://mms" ), null , null , null , null );
  2. String[]temp=cur.getColumnNames();
  3. for ( int i= 0 ;i<temp.length;i++)
  4. System.out.println(i+ ":" +temp);


通过上面的方法得到cursor后,就可以对这个cursor操作,并通过get方法得到_id,然后根据这个_id读取彩信附件文件。

2、读取彩信附件文件

彩信附件文件的地址存储在mmssms.db的part表的_data字段,形如“/data/data /com.android.providers.telephony/app_parts/PART_1262693697763”,但在应用中读取彩信 附件时,这个字段基本没什么用,因为不能直接读取这个文件。读取同样要通过ContentProvider,URI为“content://mms /part”,该URI就是对应着part表。可以使用下列代码段来读取文件:

Java代码
  1. Stringselection= new String( "mid='" +key+ "'" ); //这个key就是pdu里面的_id。
  2. Cursorcur=getContentResolver().query(Uri.parse( "content://mms/part" ), null ,selection, null , null );
  3. if (cur.moveToFirst())
  4. do {
  5. int _partID=cur.getInt(cur.getColumnIndex( "_id" ));
  6. StringpartID=String.valueOf(_partID);
  7. UripartURI=Uri.parse( "content://mms/part/" +partID);
  8. ByteArrayOutputStreambaos= new ByteArrayOutputStream();
  9. InputStreamis= null ;
  10. try {
  11. is=getContentResolver().openInputStream(partURI);
  12. byte []buffer= new byte [ 256 ];
  13. int len=is.read(buffer);
  14. while (len>= 0 )
  15. {
  16. baos.write(buffer, 0 ,len);
  17. len=is.read(buffer);
  18. }
  19. } catch (IOExceptione){
  20. } finally {
  21. if (is!= null ){
  22. try {
  23. is.close();
  24. } catch (IOExceptione){
  25. }
  26. }
  27. }
  28. }


这里得到的baos,就是附件文件。

3、声明permission

要在代码中使用content://mms,content://mms/part,content://sms等,还要在 AndroidManifest.xml中注册premission,代码如下:

Java代码
  1. </application>
  2. <uses-permissionandroid:name= "android.permission.READ_SMS" />

更多相关文章

  1. Android(安卓)截图实现
  2. Android系统权限和root权限
  3. 手动root android 模拟器(emulator)详细过程
  4. Android(安卓)解决APN无权限问题
  5. android 系统目录
  6. android Tether 分析
  7. Android(安卓)对话框【Dialog】去除白色边框代码
  8. Android(安卓)上传图片到服务器(多文件上传)
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android强制联网
  2. Android on OMAP
  3. textview cannot be resolved to a type
  4. AndroidManifest.xml中的内容详解
  5. Android -- android.support.v7.internal
  6. Android之Intents 和Intent Filters
  7. android onKeydown
  8. Android中的Context对象
  9. Android 摇一摇功能的实现
  10. 制作android native service