2012-11-20 313 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