【问题标题】:Android: Media Player release and null issue?Android:媒体播放器发布和空问题?
【发布时间】:2012-10-31 18:53:43
【问题描述】:

单击按钮(2 秒)即可播放一段声音片段。完成后,我调用了一个新活动并发布了媒体播放器。

但是我的应用程序崩溃了。

我的代码

final ImageButton TtriangleButton=(ImageButton)findViewById(R.id.triangleTriangle);
    TtriangleButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            /* Code for playing the "Very Good" sound */    
            final MediaPlayer mediaPlayer = MediaPlayer.create(shapeTriangleActivity.this, R.raw.applause);
            mediaPlayer.start();

            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {

                    Intent myintent1 = new Intent(shapeTriangleActivity.this,LearningTimeMenu.class);
                    myintent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(myintent1);
                    mediaPlayer.release();

                }});
        }});

我遇到的另一个问题是,在发布时我也尝试添加 NULL mediaPlayer = null; -- 但是我得到一个编译错误,比如“最终的局部变量 mediaPlayer 不能被分配,因为它是在封闭类型中定义的”。

我坚持这一点。需要帮助。

已更新错误日志

10-31 14:54:45.800: E/AndroidRuntime(859): android.content.res.Resources$NotFoundException: 资源 ID #0x7f040006

我的文件也是 .wav 文件。我注意到 .mp3 文件没有这个问题,即使它们的文件大小相同。

【问题讨论】:

  • 你为什么要让你的变量为空?

标签: android


【解决方案1】:

在开始这样的新活动之前释放媒体播放器 ::

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayer.release();
                Intent myintent1 = new Intent(shapeTriangleActivity.this,LearningTimeMenu.class);
                myintent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(myintent1);


            }});

【讨论】:

  • 在发布后尝试将媒体播放器设置为空,并进行一项更改以全局创建媒体播放器实例。希望它可以帮助你:)
【解决方案2】:

试试这个方法……

-你应该release它,然后在播放完成后分配null

- 当您想播放另一种声音时,再次initialize 媒体播放器

 mPlayer.start();
 mPlayer.setOnCompletionListener(new OnCompletionListener() {

 @Override
public void onCompletion(MediaPlayer mp) {

             mPlayer.release();  // 
             mPlayer = null;

        }
});

-如果您只播放 2 秒的声音片段,请使用SoundPool 来执行此操作,因为SoundPool 适合这些声音片段......

这里有一些限制 SoundPool

- 声音文件应不超过 1 MB。

- 使用.wav 声音文件获得最佳效果,使用.mp3, .mp4, .m4a 甚至可以。

-请使用 128kb/sec 的 bitrate 和 22050KHz sampling rate,完整播放声音片段

【讨论】:

  • 在上面的代码中 - 当我插入 mPlayer = null; --> 它给了我一个编译错误->“无法分配最终的局部变量 mediaPlayer,因为它是在封闭类型中定义的”。知道这是为什么吗?
  • @Jasma 在 Class 范围内声明 mPlayer 类型为 MediaPlayer
  • 我可以确认,不设置 MediaPlayer object = null 来强制立即进行垃圾收集可能会在以后导致 IllegalStateErrors。就我而言,我在我的活动的 onDestroy() 方法中释放了播放器,但是当我重新启动应用程序时,我会收到错误消息。在 release() 修复后将其设置为 null。
【解决方案3】:

第一个 stop 媒体播放器,然后release它。

【讨论】:

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