mediaplay踩坑

2020-03-27  本文已影响0人  Birdd

刚刚公司代码里发现个问题,记录一下,碰到的小伙伴参考一下

坑一:

    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

上一篇 下一篇

猜你喜欢

热点阅读