刚刚公司代码里发现个问题,记录一下,碰到的小伙伴参考一下
坑一:
public static void playSoundByMedia(int rawId,MediaPlayer.OnCompletionListener beepListener) {
try {
MediaPlayer mediaPlayer= null;
if(mediaPlayer==null){
mediaPlayer = new MediaPlayer();
}
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnCompletionListener(beepListener);
try {
AssetFileDescriptor file = Utils.getApp().getResources().openRawResourceFd(
rawId);
mediaPlayer.setDataSource(file.getFileDescriptor(),
file.getStartOffset(), file.getLength());
file.close();
mediaPlayer.setVolume(0.50f, 0.50f);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
LogUtils.e("tag","tts:IO:"+e.toString());
mediaPlayer = null;
}
} catch (Exception e) {
LogUtils.e("tag","tts:"+e.toString());
e.printStackTrace();
}
}
第一次播放正常,后边就会出现断断续续的
试了很多方法都不正常,后来发现,mediaplay不可以在放在方法里,这样,GC会提前回收,导致播放中断,正确处理办法是把它放到activity.
坑二:
SoundUtils.setMediaPlayer(speakText,mediaPlayer, new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.release();
mediaPlayer=null;
}
});
在播放完毕之后需要释放mediaplay,但注意,这里我们要释放的是java代码中的mediaplay,上面onCompletion返回的mp,这个其实是native里的mediaplay,虽然他们是一起工作的,但并不是一个东西,这时候释放了mp,并没有真正释放activity的mediaplay.所以要专门释放一下activity的mediaplay
网友评论