【问题标题】:MediaPlayer causes FC errorMediaPlayer 导致 FC 错误
【发布时间】:2011-02-05 15:04:41
【问题描述】:

好的,我收到了这个 FC 错误。

我已经检查了三遍代码并尝试了两次重写。这是我能够学习的最有效的代码。但我仍然得到FC。 当我试图为我的程序播放大约 50 个声音文件时,我将不胜感激。每个活动十五到二十之间。

implements OnClickListener {
MediaPlayer mp1;
MediaPlayer mp2;
MediaPlayer mp3;
MediaPlayer mp4;
MediaPlayer mp5;
MediaPlayer mp6;
MediaPlayer mp7;



public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.verbs);

    mp1 = MediaPlayer.create(this, R.raw.play);
    mp2 = MediaPlayer.create(this, R.raw.eat);
    mp3 = MediaPlayer.create(this, R.raw.can);
    mp4 = MediaPlayer.create(this, R.raw.go);
    mp5 = MediaPlayer.create(this, R.raw.help);
    mp6 = MediaPlayer.create(this, R.raw.practice);
    mp7 = MediaPlayer.create(this, R.raw.use);





    final Button button1 = (Button) findViewById(R.id.play_button);
    button1.setOnClickListener(this);

    final Button button2 = (Button) findViewById(R.id.eat_button);
    button2.setOnClickListener(this);

    final Button button3 = (Button) findViewById(R.id.can_button);
    button3.setOnClickListener(this);

    final Button button4 = (Button) findViewById(R.id.go_button);
    button4.setOnClickListener(this);

    final Button button5 = (Button) findViewById(R.id.Thelp_button);
    button5.setOnClickListener(this);

    final Button button6 = (Button) findViewById(R.id.pract_button);
    button6.setOnClickListener(this);

    final Button button7 = (Button) findViewById(R.id.use_button);
    button7.setOnClickListener(this);

    final Button button8 = (Button) findViewById(R.id.Back_Button);
    button8.setOnClickListener(this);



}

  public void onClick(View v) {
    switch(v.getId()) {
    case R.id.play_button:
        mp1.start();
        Toast.makeText(VerbsActivity.this, "PLAY",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.eat_button:
        mp2.start();
        Toast.makeText(VerbsActivity.this, "EAT",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.can_button:
        mp3.start();
        Toast.makeText(VerbsActivity.this, "CAN",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.go_button:
        mp4.start();
        Toast.makeText(VerbsActivity.this,"GO",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.Thelp_button:
        mp5.start();
        Toast.makeText(VerbsActivity.this,"HELP",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.pract_button:
        mp6.start();
        Toast.makeText(VerbsActivity.this, "PRACTICE",
                Toast.LENGTH_LONG).show();
        break;
    case R.id.use_button:
        mp7.start();
        Toast.makeText(VerbsActivity.this, "USE",
                Toast.LENGTH_LONG).show();
        break;

    case R.id.Back_Button:
        finish();
        break;

    }
}

@Override
protected void onDestroy() {
      mp1.release();
      mp2.release();
      mp3.release();
      mp4.release();
      mp5.release();
      mp6.release();
      mp7.release();

    super.onDestroy();
}

}

【问题讨论】:

  • FC 的堆栈跟踪会很有用,但已经很清楚您应该使用 SoundPool 而不是 15 个单独的 MediaPlayer。
  • 还描述了导致它崩溃的情况......它是否在启动时死亡,它是否运行几分钟然后崩溃,它会在失败之前播放一定数量的声音吗?

标签: android audio media-player


【解决方案1】:

您正在创建太多的 MediaPlayer 对象,这很容易导致异常。您也在 onDestroy() 方法中释放它们,在很多情况下不会调用。

更改您的代码以改用 SoundPool。

【讨论】:

  • – Reuben Scratton Ian G. Clifton 我在另一个帖子上看到了一些关于 soundpool 的内容,但是当我开始用谷歌搜索它时,我发现它还没有完成,人们无法让它工作。因为我是初学者,所以我想因为它还没有准备好,所以我肯定无法让它运行。至于 FC 类型,程序会加载,但是当我想进入具有媒体播放器的活动时,它会返回上一个活动。我已经尝试了上述方法,我只使用了一个媒体播放器,但它仍然返回到之前的活动。
  • 我会验证帖子的年龄,说它还没有完成,因为它们可能只是旧的。我在 Android 1.5-2.3 上使用 SoundPool 没有问题,但一次只播放一种声音。多个 MediaPlayer 的问题在于系统资源有限,即使在最好的情况下也可能无法创建大约 15 个。如果只是创建一个导致失败,那么其他事情正在发生。尝试编辑您的帖子以包含堆栈跟踪,我们应该能够提供更多帮助。
  • 我读到了这个 soundpool 的东西。我还看了几个教程,这件事我不得不说谢谢大家,因为这很快解决了我的问题。虽然我必须说我必须将我的声音文件转换为 ogg 文件,并且修复了弹出的简单黑屏。谢谢大家。
  • @Ian G. Clifton 好的 soundpool 我遇到了这个错误。好吧,这不是一个错误,但让我解释一下。我尝试了此链接中的两个示例。 droidnova.com/creating-sound-effects-in-android-part-1,570.htmldroidnova.com/creating-sound-effects-in-android-part-2,695.html 第一个只有在我有一个声音文件时才有效。当我试图做的不仅仅是它会fc的事情。第二个效果很好。这就是为什么我很高兴。但是我有三个活动,每个活动将使用十五个声音。并且在一项活动中效果很好。所有三个只有第三个有效
  • @Ian G. Clifton 但是只有第三个可以工作,并且只有一个声音文件可以在第三个上工作。因此,如果我对我的声音池的设置方式进行了粗略的了解,那就是这样。从教程中,我使用了他们的声音管理器文件并按照文档所述添加了它。在 src 文件> soundmanager.java main.javasounds.java soundactivity1 soundactivity2 soundactivity3。当我使用该程序时,我可以从 main 中获取声音,但声音管理器中有 45 个声音,每个活动 1 和 2 FC 有 15 个。 3 打开但只播放第一个按钮上的最后一个声音。所有其他声音按钮都可以制作 FC。
【解决方案2】:

哇!为什么要使用这么多 MediaPlayer 对象?为什么不拥有一个媒体播放器对象,然后在单击该按钮时为其分配资源?我不知道你的应用程序是做什么的,但我会像这样编写上面的代码(或至少一个 sn-p):

MediaPlayer mp1;    //just have one MediaPlayer object.

public void onClick(View v) {
      switch(v.getId()) {
      case R.id.n1_button:
            if(mp1.create(this, R.raw.sound1) == NULL) {
              Log.v(this.toString(), "Unable to create mediaplayer object.");
            }
            try {
      mp1.start();
    } catch(IllegalStateException e) {
      e.printStackTrace();
     Log.v(this.toString(), "Illegal State Exception caught in start.");
    }
          Toast.makeText(NounsActivity.this, "word",
                       Toast.LENGTH_LONG).show();
        break;
      case R.id.n2_button:
        if(mp1.create(this, R.raw.sound1) == NULL) {
              Log.v(this.toString(), "Unable to create mediaplayer object.");
         }
         try {
    mp1.start();
      } catch(IllegalStateException e) {
    e.printStackTrace();
        Log.v(this.toString(), "Illegal State Exception caught in start.");
      }

          Toast.makeText(NounsActivity.this, "word",
                       Toast.LENGTH_LONG).show();
        break; and so on....

 @Override
    protected void onDestroy() {
        mp1.release();     //you just need to release one mediaplayer object now. 
        super.onDestroy();
    }

但更一般的注意事项:将所有在 trycatch 语句块中调用 MediaPlayer 的语句包围起来,并通过将某些内容打印到 LogCat 的 copius 语句为自己提供轻松调试的好处。您可以获取有关将调试信息打印到 LogCat here 和 MediaPlayer 文档的更多信息,了解关于哪个语句抛出哪个异常 here

HTH,
斯里拉姆。

【讨论】:

  • 我试过这个,它只使用一个媒体播放器。但仍然在活动启动之前它是 FC。因此程序加载,当我单击按钮更改为该活动时,它的 FCs。但奇怪的是,它并没有完全崩溃,只是 FC 恢复了活动。抱歉,我是一个非常新的初学者,所以我不知道如何设置 catch 语句。或者尝试一下。
  • 我做了一些感谢 Sriram 虽然我不知道答案是什么意思。ShellCommandUnResponsive 然后是其他的东西。除非是错的。但是还是不行。
  • @BluMouse:我已经编辑了上面的代码,为您提供了一个示例 try and catch 语句块并打印到 LogCat。您可以在 Eclipse 中通过打开其窗口来查看打印到 LogCat 的语句。在 Eclipse 中,这是通过转到 Windows -> Show Views -> Other -> LogCat 来完成的。希望有帮助。斯里拉姆
  • 好的 soundpool 我遇到了这个错误。好吧,这不是一个错误,但让我解释一下。我尝试了此链接中的两个示例。 droidnova.com/creating-sound-effects-in-android-part-1,570.htmldroidnova.com/creating-sound-effects-in-android-part-2,695.html
  • @Sriram mp1.create(this, R.raw.age) == NULL) mp1.create(this,R.raw.age 带有黄色下划线。选项更改为静态,使 mp1 变为MediaPlayer,修复十五个错误。在onclick()中添加错误抑制。Null用红色下划线。选项创建常量,变量,字段参数,或更改为mp1。我该怎么办?
【解决方案3】:

仅根据 Sriram 的建议进行错误检查即可回答问题。

为 soundpool 错误启动新线程以使其更清晰。

【讨论】:

  • 如果问题已被回答,则应将其标记为已回答。另外,这不是答案。并且不要在回答后删除您的问题,现在没有人知道答案是什么。
  • 如果答案有效,您可能希望将其标记为正确答案。它将帮助其他遇到该主题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多