我知道这很旧,但是我搜索了一个答案,但没有找到任何真正允许从没有临时文件的字节数组中播放的答案,而且确实有一种非常简单的方法,可以创建自定义 MediaDataSource。
我在这里发布了 Xamarin Android 的代码,但它很容易移植到 Java,问题是你可以看到实现它的方法。
请注意,这些方法是在 android 6.0 SDK 中添加的,如果您面向较低版本的 Android,则必须使用正确的兼容性支持库。
public class AudioPlayer
{
MediaPlayer currentPlayer;
public void Play(byte[] AudioFile, bool Loop)
{
Stop();
currentPlayer = new MediaPlayer();
currentPlayer.Prepared += (sender, e) =>
{
currentPlayer.Start();
};
currentPlayer.Looping = Loop;
currentPlayer.SetDataSource(new StreamMediaDataSource(new System.IO.MemoryStream(AudioFile)));
currentPlayer.Prepare();
}
public void Stop()
{
if (currentPlayer == null)
return;
currentPlayer.Stop();
currentPlayer.Dispose();
currentPlayer = null;
}
}
public class StreamMediaDataSource : MediaDataSource
{
System.IO.Stream data;
public StreamMediaDataSource(System.IO.Stream Data)
{
data = Data;
}
public override long Size
{
get
{
return data.Length;
}
}
public override int ReadAt(long position, byte[] buffer, int offset, int size)
{
data.Seek(position, System.IO.SeekOrigin.Begin);
return data.Read(buffer, offset, size);
}
public override void Close()
{
if (data != null)
{
data.Dispose();
data = null;
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (data != null)
{
data.Dispose();
data = null;
}
}
}