2012-11-20 361 views
2

我正在試圖製作一個媒體播放器,用於播放來自Amazon S3的歌曲。 我在公開場合製作了歌曲,當我用bowser進行流式播放時,效果很好。 但是,當它來到android,它會引發我這樣的異常。FileNotFoundException亞馬遜S3

11-20 01:28:37.720: W/System.err(736): java.io.FileNotFoundException: /https:/s3.amazonaws.com/soul-media/mp3s/1234.mp3: open failed: ENOENT (No such file or directory) 

,這裏是我的球員

MediaPlayer mid= new MediaPlayer(); 
    try { 
     FileInputStream fid= new FileInputStream("https://s3.amazonaws.com/soul-media/mp3s/1234.mp3"); 
     mid.setDataSource(fid.getFD()); 
     mid.prepare(); 
     mid.start(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

它的工作與Android 4.1,但沒有2.2的工作,可以說是問題的代碼? 我也嘗試了一些除Amazon S3以外的其他網站,它的工作原理。那麼亞馬遜呢?

回答

0

是否有任何理由不能跳過創建FileInputStream並致電mid.setDataSource("https://s3.amazonaws.com/...")通過this overload?那樣有用嗎?

編輯: 顯然,不是調用prepare對於流,你應該叫prepareAsync應立即返回,就像這樣:

MediaPlayer mid = new MediaPlayer(); 
try { 
    mid.setDataSource("http://soul-media.s3.amazonaws.com/mp3s/1234.mp3"); 
    mid.setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mp.start(); 
     } 
    }); 
    mid.setOnErrorListener(new OnErrorListener() { 
     @Override 
     public boolean onError(MediaPlayer mp, int what, int extra) { 
      return false; 
     } 
    }); 
    mid.prepareAsync(); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} catch (IllegalStateException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

這是否幫助?

+0

是的,我也試過。但它給了我一個錯誤說:Parpare失敗 – ghycy15

+0

哦,我明白了。我想也許MediaPlayer不支持HTTPS,所以你需要HTTP URL,這是不同的。使用此:「http://soul-media.s3.amazonaws.com/mp3s/1234.mp3」 相應地編輯源。得到這個在我的機器上工作。 – Hexar

+0

仍然無法正常工作,它表示錯誤(-38,0) – ghycy15