2010-11-14 45 views
0

我有一個應用程序,我正嘗試在關於媒體播放器使用的問題上進行調試。我有一個活動顯示與服務後面的服務輪詢一個服務器。活動顯示服務從服務器收集的動態狀態。這很好。然後,我在服務用於播放音頻文件的類中添加了一些代碼,如果它看到特定的數據項。這在前幾次運行良好,但隨後應用程序將凍結,甚至最終可能會關閉可怕的部隊。
我在日誌文件中看到以下內容。其關於我的警告和我似乎無法找到任何信息。Android MediaPlayer最終導致應用程序停止

11-14 10:12:29.742: WARN/AV(28909): #### Attempting to play audio #### 
11-14 10:12:29.742: WARN/[email protected](28909): #### AV - Playing audio #### 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_Init 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 0 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.avc 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.avc 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 1 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 2 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.h263 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.decoder.h263 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 3 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.mpeg4 
11-14 10:12:29.772: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 4 
11-14 10:12:29.772: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.h263 
11-14 10:12:29.782: INFO/QC_CORE(103): GetRolesOfComponent OMX.qcom.video.encoder.h263 
11-14 10:12:29.782: INFO/QC_CORE(103): OMXCORE API - OMX_ComponentNameEnum 5bf30 128 5 
11-14 10:12:29.862: WARN/MediaPlayer(28909): info/warning (1, 44) 
11-14 10:12:29.862: INFO/MediaPlayer(28909): Info (1,44) 

我使用的媒體播放器這樣的:

private void playMedia(int  audioResource, 
         boolean vibrate) 
    { 
     Log.i("AV", "#### Attempting to play audio ####"); 

     if (this.lastAlert + VIBRATION_LENGTH <= System.currentTimeMillis()) 
     { 
      this.lastAlert = System.currentTimeMillis(); 

      Log.i(this.toString(), "#### AV - Playing audio ####"); 

      try 
      {  
       MediaPlayer mediaPlayer = new MediaPlayer(); 
       AssetFileDescriptor assetFileDescriptor 
       = this.context.getResources().openRawResourceFd(audioResource); 
       mediaPlayer.setOnCompletionListener(this); 
       mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), 
             assetFileDescriptor.getStartOffset(), 
             assetFileDescriptor.getLength()); 
       mediaPlayer.prepare(); 
       mediaPlayer.start(); 
      } 
      catch (Exception e) 
      { 
       Log.e(this.toString(), e.toString()); 
       e.printStackTrace(); 
      } 

      if (vibrate) 
      { 
       if (null != this.vibrator) 
       { 
       this.vibrator.vibrate(VIBRATION_LENGTH); 
       } 
      } 
     } 
     else 
     { 
      Log.w(this.toString(), "##### AV - Audio is already playing #####"); 
     } 
    }// end playMedia 

    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) 
    { 
     mediaPlayer.reset(); 
     mediaPlayer.release(); 

     Log.i(this.toString(), "#### ################################### ####"); 
     Log.i(this.toString(), "#### AV - reset and release media player ####"); 

    } 

音頻文件是MP3格式。

回答

3

每次將其設置爲數據源時,您必須在AssetFileDescriptor上調用close。即使是SDK doc,你也可以在調用setDataSource之後安全地釋放一個文件描述符。

+0

謝謝你的想法。這個問題在這一點上是OBE(被事件克服)。我不確定這是否是問題。我最終沒有使用文件描述符。當時的媒體播放器也不在實際的活動中。這是現在,我沒有更多的問題。 – bursk 2011-03-04 19:29:09

相關問題