簡體   English   中英

Media Player創建失敗時如何恢復?

[英]Media Player how to recover when create fails?

我有一個應用程序,它每秒隨機播放20種不同聲音中的1種。 在成功運行近1000次之后,媒體播放器創建函數開始始終返回null。 即使我離開應用程序並再次啟動它,問題仍然存在。 唯一的解決方案是當我再次安裝該應用程序或關閉電源后再打開設備。

有什么方法可以從這種狀態中恢復嗎? 如果我確實釋放或重置,則媒體播放器已經為空,並且它們會產生異常。

我每秒執行的序列如下:

if (mp != null)
{   
    if (mp.isPlaying()) 
    {
       mp.stop();   
    }   
    if (mp != null) mp.release();   
    if (mp != null) mp = null;  
}   

mp = MediaPlayer.create(this, R.raw.sound);

if (mp !=null)
{
   mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
   {           
      public void onPrepared(MediaPlayer mp) 
      {
    if (mp != null) mp.start();
      }
   };
 }
 else
 {
    // error, what should I do here to recover from this situation?
 }

您的問題是,即使在發布MediaPlayer ,在您再次嘗試使用OS時,操作系統可能仍未釋放資源,尤其是每秒20次。 實際上,我建議您考慮使用SoundPool代替類似的東西。

無論如何,要使用MediaPlayer做到這一點,您應該只保留一個引用,並每次針對不同的聲音重用該對象。 由於您正在使用原始資源進行播放,因此通常的重用場景如下所示:

AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.sound);

//Resets the MediaPlayer state but keeps the resources
mp.reset();

//Sets the data source to the requested sound (R.raw.sound)
mp.setDataSource(afd.getFileDescriptor());

//Prepare the MediaPlayer to play and then start
mp.prepare();
mp.start();

看來我找到了解決方案。 我現在播放了10000多個音頻,而不再重現錯誤。

我要感謝kcoppock的幫助,我現在不創建和發布,因為更改數據源要比他解釋的要好得多,但這不是主要問題。

最終解決方案是將所有mp3文件轉換為ogg文件!

Media Player絕對具有mp3文件問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM