我试图通过MediaPlayer的setAudioStreamType(AudioManager.STREAM_VOICE_CALL)播放许多音频(mp3)文件;但是mp.start();不玩,也不抛出异常。 该设置适用于SoundPool,但限制为5秒,有些文件播放时间长达8秒。 我在这里附上了部分代码:
String s = absolutepath.get(position);
Uri u = Uri.parse(s);
playing = (MediaPlayer) MediaPlayer.create(MainActivity.this, u);
playing.setOnPreparedListener(this);
onPrepared包括:
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
spProgress.cancel();
mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
try {
mp.start();
} catch (IllegalStateException e) {
Toast.makeText(this, "exception", Toast.LENGTH_SHORT).show();
}
}
我试过这个没有try / catch甚至没有听众。它播放的唯一时间是我不使用流类型STREAM_VOICE_CALL。
可以使用SoundPool播放相同的文件:
SoundPool sp = new SoundPool(1, AudioManager.STREAM_VOICE_CALL, 0);
sp.load(s, 1);
sp.setOnLoadCompleteListener(this);
监听器:
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
// TODO Auto-generated method stub
if (status == 0) {
spProgress.cancel();
sp.play(sampleId, 1, 1, 1, 0, 1);
} else {
Toast.makeText(this, "failed to load", Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:3)
我实际上遇到了同样的问题,谷歌的指南在这里非常糟糕 - 它确实有点棘手,但很容易解释:
当你需要更改STREAM,然后再次准备()你的MediaPlayer时,你可以通过这样做来实现它:
Resources res = getResources();
AssetFileDescriptor afd = res.openRawResourceFd(R.raw.tts_a);
mp = new MediaPlayer();
//mp.reset();
mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mp.setLooping(false);
try {
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
实际的技巧是不要使用MediaPlayer.create,因为它正在调用prepare本身!因此,您无法设置流。通过使用AssetFileDescriptor设置File,您可以设置Stream并在之后调用prepare()!