【问题标题】:How do I release MediaPlayer after it finishes playing a sound?播放完声音后如何释放 MediaPlayer?
【发布时间】:2013-03-03 18:13:21
【问题描述】:

我有一个类似应用程序的音板。即使用户单击另一个声音,我也不希望声音停止。但是,过了一会儿,就像 30 次点击(声音播放器)一样,它停止了。我认为它内存不足或 Android 不允许它创建超过 30 个实例。

如何更好地实现这一点,以便在声音结束后销毁媒体播放器实例?

import java.io.IOException;

public class AudioRecordTest {
    private static final String LOG_TAG = "AudioRecordTest";
    private static String mFileName = null;
    private MediaRecorder mRecorder = null;
    private MediaPlayer mPlayer = null;


    public void startPlaying(int fileName) {
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName + fileName + ".3gp");
            mPlayer.prepare();
            mPlayer.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopPlaying() {
        try {
            if (mPlayer != null) {
                mPlayer.release();
                mPlayer = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public MediaPlayer getPlayer() { 
        return mPlayer;
    }

    public void startRecording(int fileName) {
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName + fileName + ".3gp");
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch (IOException e) {
            Log.e(LOG_TAG, "prepare() failed");
            e.printStackTrace();
        }

        try {
            mRecorder.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopRecording() {
        try {
            if (mRecorder != null) {
                mRecorder.stop();
                mRecorder.release();
                mRecorder = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public AudioRecordTest() {
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/aaa";

    }

}

【问题讨论】:

    标签: android media-player android-mediaplayer


    【解决方案1】:

    试试这个

     voicePlayer.getMediaPlayer().setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.stop();
                if (mediaPlayer != null) {
                    mediaPlayer.killMediaPlayer();
                }
    
            }
        });
    

    【讨论】:

    • 什么是.killMediaPlayer()?你的意思是.release?以及为什么在检查 null 之前要 .stop()?
    【解决方案2】:

    你可以使用release() 的媒体播放器

    if(!mediaPlayerObject.isPlaying()) 
       mediaPlayerObject.release();
    

    【讨论】:

    • 但是在播放声音时会被跳过
    • 设置一个 onCompletionListener 并在它被调用时执行它。然后你可以释放它。当然,重复使用同一个播放器而不创建超过 1 个播放器会更有意义。
    【解决方案3】:

    试试这个:

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.release();
                }
            });
    

    或者:

    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mediaPlayer.release();
                    mediaPlayer = null;
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多