【问题标题】:Android MediaPlayer Error( start called in state 1; error (-38, 0); Error (-38,0))Android MediaPlayer 错误(在状态 1 中调用开始;错误 (-38, 0);错误 (-38,0))
【发布时间】:2016-06-29 21:30:49
【问题描述】:

我为 SoundManagement 创建了一个包,其中包含一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码:

package soundmanagement;

import android.content.Context;

import android.media.MediaPlayer;

import java.io.IOException;

public class MusicManager extends MediaPlayer {

    public static MediaPlayer mediaPlayer = new MediaPlayer();

    public void MusicManager() {
    }

    public static MediaPlayer create(Context context, int musicID) {
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
        mediaPlayer.create(context, musicID);
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mediaPlayer.create(context, musicID);
    }

    public void prepare() {
        try {
            mediaPlayer.prepare();
            super.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        if (mediaPlayer != null) {
            mediaPlayer.start();
        }
        super.start();
    }

    public void pause() {
        mediaPlayer.pause();
        super.pause();
    }

    public void stop() {
        super.stop();
        mediaPlayer.release();
    }

    public void release() {
        mediaPlayer.release();
        super.release();
    }

    public boolean isPlaying(boolean isPlaying) {
        super.isPlaying();
        return isPlaying;
    }

    public void setLooping(boolean setLoop) {
        mediaPlayer.setLooping(setLoop);
        super.setLooping(setLoop);
    }
}

在我的 MainActivity.class 中,在 onCreate() 中,我所做的只是在 onCreate() 中编写这段代码:

MusicManager.mediaPlayer.create(MainActivity.this, R.raw.riseofcc);
MusicManager.mediaPlayer.start();

应用程序编译并运行良好,只是启动后没有音乐播放。

【问题讨论】:

  • 如果你的类扩展了MediaPlayer,那么MusicManager 对象就是一个 MediaPlayer。那你为什么要创建一个新的MediaPlayer,这样你就有了两个MediaPlayers?你确定这是你想要的吗?也许这是你想要的,我不明白你的代码,但我以前见过那个错误。
  • @ajb... 我认为问题在于 MediaPlayer 没有公开很多内部工作,并将很多方法标记为最终方法。 ...但是,这仍然不是最佳方法。
  • 是的,对不起,伙计们,我只是想成为一个在整个应用程序中通用的媒体播放器。我将有多个活动来操作它(暂停、启动、创建),我需要它以单独的格式。我尝试在每个 Activity 中使用单个 MediaPlayer,但很快事情就变得复杂了。

标签: java android android-mediaplayer


【解决方案1】:

您对 MediaPlayer 采取了一种奇怪的方法,但让我感到震惊的是:

public static MediaPlayer create(Context context, int musicID) {
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
        mediaPlayer.create(context, musicID);
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mediaPlayer.create(context, musicID);
    }

您调用 mediaPlayer.create(),然后调用 .prepare(),然后再次调用 create(...)?

另外,create 是一个静态方法,所以它应该被称为 MediaPlayer.create 并且你应该持有对它的引用。当您调用 prepare() 时,您是在对尚未创建的 MediaPlayer 对象调用 prepare()。

编辑:如果您想保留此方法,请相应修改:

public static MediaPlayer create(Context context, int musicID) {
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
        mediaPlayer = MediaPlayer.create(context, musicID);
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mediaPlayer;
    }

【讨论】:

  • 它告诉我需要退货,我已经尝试退货:return mediaPlayer; ||返回 mediaPlayer.create(...);在我在这里提问之前,这段代码是我最后一次尝试。我明白你在说什么,我会尝试重新做。
  • 谢谢,非常感谢!在任何其他时间我必须扩展一个 API 类,对于超类中的方法,最好使用所述的构造函数?:mediaPlayer = MediaPlayer.create(..);
  • 老实说,我不确定您为什么要扩展 MediaPlayer 类。通常最好编写一个包装器来处理各种状态,如下所示:gist.github.com/danielhawkes/1029568
  • 这看起来像我见过的其他布局的框架。我认为扩展它的方法会更简单,因此我可以操作一个在所有 Activity 之间共享的单独类。但它看起来只要将其实例化为 MediaPlayer 对象,它就包含所有方法。抱歉,我是新手,没有导师。
  • 没关系,我们都去过那里:)。我仍然不明白你为什么需要扩展 MediaPlayer。您获得的功能并不多。即使在上述对象中,您也在扩展 MediaPlayer,但您持有对不同 MediaPlayer 对象的单独引用。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多