Blogger Scott

          在Android應(yīng)用中讀取彩信文件

              在Android應(yīng)用中讀取彩信文件涉及到Android的一個(gè)數(shù)據(jù)庫(kù)/data/data/com.android.providers.telephony/databases/mmssms.db和一個(gè)文件夾/data/data/com.android.providers.telephony/app_parts。要備份彩信,可以將這個(gè)數(shù)據(jù)庫(kù)和文件夾拷貝到硬盤,但是在應(yīng)用中卻不能通過(guò)openDatabase系列方法來(lái)讀這個(gè)數(shù)據(jù)庫(kù),也不能通過(guò)直接打開文件來(lái)讀取附件文件,因?yàn)槟愕膽?yīng)用不是它們的所有者,不能直接讀取,而要使用ContentProvider來(lái)讀取。
           
          1、讀取mmssms.db數(shù)據(jù)庫(kù)
           
              彩信的標(biāo)題、發(fā)送者號(hào)碼、日期等數(shù)據(jù)存儲(chǔ)在mmssms.db的pdu表中,要讀取這個(gè)表可以使用系統(tǒng)提供的一個(gè)ContentProvider,URI是“content://mms”。操作這個(gè)ContentProvider和操作數(shù)據(jù)庫(kù)一樣,這個(gè)ContentProvider的結(jié)構(gòu)也和pdu表的結(jié)構(gòu)一樣,Android文檔對(duì)這些字段沒(méi)有說(shuō)明,但是可以通過(guò)將mmssms.db數(shù)據(jù)庫(kù)備份到硬盤上,然后再通過(guò)Sqlite Database Browser軟件來(lái)查看分析,具體可參考:http://www.aygfsteel.com/easywu/archive/2010/01/10/308959.html
              content://mms主要的幾個(gè)字段如下:
                    ◆ _id:該條彩信的主鍵,對(duì)應(yīng)著part表(ContentProvider的URI是content://mms/part,詳見后)中的mid字段。
                    ◆sub:該條彩信的標(biāo)題
                    ◆date:該條彩信的接收日期
              下面的代碼可以查詢?cè)揅otnetProvider,得到一個(gè)cursor,并列出所有的列名。
                  Cursor cur = getContentResolver().query(Uri.parse("content://mms"),nullnullnullnull);

                  String [] temp
          =cur.getColumnNames();
                  
          for (int i=0;i<temp.length;i++)
                  System.out.println(i
          +":"+temp[i]); 
               通過(guò)上面的方法得到cursor后,就可以對(duì)這個(gè)cursor操作,并通過(guò)get方法得到_id,然后根據(jù)這個(gè)_id讀取彩信附件文件。


          2、讀取彩信附件文件
                彩信附件文件的地址存儲(chǔ)在mmssms.db的part表的_data字段,形如“/data/data/com.android.providers.telephony/app_parts/PART_1262693697763”,但在應(yīng)用中讀取彩信附件時(shí),這個(gè)字段基本沒(méi)什么用,因?yàn)椴荒苤苯幼x取這個(gè)文件。讀取同樣要通過(guò)ContentProvider,URI為“content://mms/part”,該URI就是對(duì)應(yīng)著part表。可以使用下列代碼段來(lái)讀取文件:
          String selection = new String("mid='" + key + "'");//這個(gè)key就是pdu里面的_id。
          Cursor cur = getContentResolver().query(Uri.parse("content://mms/part"), null, selection, nullnull);

                  
          if (cur.moveToFirst())
                      
          do {
                              
          int _partID = cur.getInt(cur.getColumnIndex("_id"));
                              String partID 
          = String.valueOf(_partID);
                              Uri partURI 
          = Uri.parse("content://mms/part/" + partID);
                              
                              ByteArrayOutputStream baos 
          = new ByteArrayOutputStream();
                              InputStream is 
          = null;

                              
          try {
                                  is 
          = getContentResolver().openInputStream(partURI);
                                  
          byte[] buffer = new byte[256];
                                  
          int len = is.read(buffer);
                                  
          while (len >= 0
                                  
          {
                                      baos.write(buffer, 
          0, len);
                                      len 
          = is.read(buffer);
                                  }

                              }
           catch (IOException e) {
                              }
           finally {
                                  
          if (is != null{
                                      
          try {
                                          is.close();
                                      }
           catch (IOException e) {

                                      }
           
                                  }

                              }

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


           3、聲明permission
             
          要在代碼中使用content://mms,content://mms/part,content://sms等,還要在AndroidManifest.xml中注冊(cè)premission,代碼如下:



              
          </application>
              
          <uses-permission android:name="android.permission.READ_SMS" />




          posted on 2010-02-19 16:16 江天部落格 閱讀(5407) 評(píng)論(1)  編輯  收藏 所屬分類: Android

          Feedback

          # re: 在Android應(yīng)用中讀取彩信文件 2012-06-15 12:29 ----ting

          謝謝分享
            回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 巨鹿县| 昭苏县| 潼关县| 长宁区| 宿松县| 岚皋县| 余江县| 乌兰县| 库伦旗| 丹江口市| 乌恰县| 蒙山县| 苗栗市| 崇信县| 广丰县| 响水县| 营山县| 灵川县| 武冈市| 诏安县| 仙居县| 上栗县| 平顺县| 堆龙德庆县| 新泰市| 鄄城县| 石楼县| 灌阳县| 迁西县| 灵川县| 新民市| 罗定市| 南昌市| 云南省| 托克逊县| 东乡族自治县| 金坛市| 富顺县| 当涂县| 马鞍山市| 新竹县|