[英]Can't use STREAM_VOICE_CALL to play audio via MediaPlayer in android java
我試圖通過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();
}
}
實際上,我遇到了同樣的問題,這里的Google指南非常糟糕-確實有些棘手,但解釋起來很簡單:
當您需要更改STREAM,然后再次prepare()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,因為它本身就是在准備! 因此,您無法設置流。 通過使用AssetFileDescriptor設置File,您可以設置Stream並隨后調用您的prepare()!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.