2

我正在尝试在来自 Amazon S3 的 android 流媒体歌曲中制作媒体播放器。我将存储桶中的歌曲公开,当我使用 Bowser 播放它们时效果很好。但是当涉及到android时,它会抛出一个这样的异常。

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 以外的一些 url,它可以工作。那么这与亚马逊有关吗?

4

1 回答 1

0

有什么理由你不能跳过创建FileInputStreammid.setDataSource("https://s3.amazonaws.com/...")通过这个重载调用?那样有用吗?

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();
}

这有帮助吗?

于 2012-11-20T22:23:13.610 回答