我有一个字节[](从服务中下载),我的MP3文件,我想发挥它我的设备类似上你可以怎么玩的文件:
MediaPlayer mp = new MediaPlayer(); mp.setDataSource(PATH_TO_FILE); mp.prepare(); mp.start();
但我似乎无法找到办法.我不介意将文件保存到手机然后播放.我该如何播放文件,或下载然后播放?
好的,感谢你们所有人,但是我需要从byte []播放mp3,因为我从.NET webservice那里得到了它(不希望在服务器上存储动态生成的mp3).
最后 - 有很多"陷阱"可以播放简单的mp3 ...这里是需要它的人的代码:
private MediaPlayer mediaPlayer = new MediaPlayer();
private void playMp3(byte[] mp3SoundByteArray) {
try {
// create temp file that will hold byte array
File tempMp3 = File.createTempFile("kurchina", "mp3", getCacheDir());
tempMp3.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempMp3);
fos.write(mp3SoundByteArray);
fos.close();
// resetting mediaplayer instance to evade problems
mediaPlayer.reset();
// In case you run into issues with threading consider new instance like:
// MediaPlayer mediaPlayer = new MediaPlayer();
// Tried passing path directly, but kept getting
// "Prepare failed.: status=0x1"
// so using file descriptor instead
FileInputStream fis = new FileInputStream(tempMp3);
mediaPlayer.setDataSource(fis.getFD());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException ex) {
String s = ex.toString();
ex.printStackTrace();
}
}
编辑:我在4年多前写过这个答案 - 显然很多事情从那以后发生了变化.请参阅Justin关于如何重用MediaPlayer实例的评论.此外,我不知道.deleteOnExit()现在是否适合你 - 随意建议改进,以便临时文件不会堆积.
我通过将我的MP3文件编码为Base64(我已经收到Restful API服务编码的数据),然后创建一个URL对象,找到了一个简单的解决方案.我在Android 4.1中测试过它.
public void PlayAudio(String base64EncodedString){ try { String url = "data:audio/mp3;base64,"+base64EncodedString; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); } catch(Exception ex){ System.out.print(ex.getMessage()); } }
启动Android MarshMellow(版本代码23),有新的API可以实现这一目标.
MediaPlayer.setDataSource(android.media.MediaDataSource)
您可以提供MediaDataSource的自定义实现并包装byte [].下面给出的基本实现.
import android.annotation.TargetApi; import android.media.MediaDataSource; import android.os.Build; import java.io.IOException; @TargetApi(Build.VERSION_CODES.M) public class ByteArrayMediaDataSource extends MediaDataSource { private final byte[] data; public ByteArrayMediaDataSource(byte []data) { assert data != null; this.data = data; } @Override public int readAt(long position, byte[] buffer, int offset, int size) throws IOException { System.arraycopy(data, (int)position, buffer, offset, size); return size; } @Override public long getSize() throws IOException { return data.length; } @Override public void close() throws IOException { // Nothing to do here } }
不确定bytearrays/bytestreams,但是如果你有来自服务的URL,你可以尝试通过调用将数据源设置为网络URI
setDataSource(Context context, Uri uri)
请参阅API文档.