Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android中彩信文件的讀取

Android中彩信文件的讀取

編輯:Android開發實例

在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. Cursor cur = getContentResolver().query(Uri.parse("content://mms"),null, null, null, null);  
  2.  
  3. String [] temp=cur.getColumnNames();  
  4. for (int i=0;i<temp.length;i++)  
  5. 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. String selection = new String("mid='" + key + "'");//這個key就是pdu裡面的_id。  
  2. Cursor cur = getContentResolver().query(Uri.parse("content://mms/part"), null, selection, null, null);  
  3.  
  4.         if (cur.moveToFirst())  
  5.             do {  
  6.                     int _partID = cur.getInt(cur.getColumnIndex("_id"));  
  7.                     String partID = String.valueOf(_partID);  
  8.                     Uri partURI = Uri.parse("content://mms/part/" + partID);  
  9.                       
  10.                     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  11.                     InputStream is = null;  
  12.  
  13.                     try {  
  14.                         is = getContentResolver().openInputStream(partURI);  
  15.                         byte[] buffer = new byte[256];  
  16.                         int len = is.read(buffer);  
  17.                         while (len >= 0)   
  18.                         {  
  19.                             baos.write(buffer, 0, len);  
  20.                             len = is.read(buffer);  
  21.                         }  
  22.                     } catch (IOException e) {  
  23.                     } finally {  
  24.                         if (is != null) {  
  25.                             try {  
  26.                                 is.close();  
  27.                             } catch (IOException e) {  
  28.  
  29.                             }   
  30.                         }  
  31.                     }  
  32.                     }  
  33.  


這裡得到的baos,就是附件文件。

3、聲明permission

    要在代碼中使用content://mms,content://mms/part,content://sms等,還要在 AndroidManifest.xml中注冊premission,代碼如下:

Java代碼
  1. </application>   
  2. <uses-permission android:name="android.permission.READ_SMS" />
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved