これが古いことは知っていますが、答えを探したところ、一時ファイルなしでバイト配列から実際に再生できるものは見つかりませんでした。実際、カスタム 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;
}
}
}