android - MediaPlayer.start() 不能在构造函数中调用?

标签 android media-player android-mediaplayer

为了减少在应用程序中的许多地方使用 MediaPlayer 时的行数,我对 MediaPlayer 进行了子类化,并在构造函数中调用每次需要播放媒体文件时重复的 3 行代码:

public MyMediaPlayer(Context context, int resid) {
    create(context, resid);
    setOnCompletionListener(this);
    start();        
}

因此,我只将其放在调用者中,而不是那 3 行:

new MyMediaPlayer(this, R.raw.happybirthday);

它可以编译、构建甚至运行,但由于某种原因媒体文件无法播放。

我检查了 LogCat 并注意到:

07-19 20:00:51.124: E/MediaPlayer(16517): start called in state 1
07-19 20:00:51.124: E/MediaPlayer(16517): error (-38, 0)

这些错误意味着什么?

我错过了什么?

顺便说一句,onCompletion()被调用并且运行良好。

最佳答案

这意味着:MediaPlayer 遵守状态图,并且您不能在每个状态下调用 start()。下面是状态图,您没有在Prepared、PlaybackCompleted 或Paused 中调用start。

即使您在正确的状态下执行此操作,直接在 onCreate 或任何其他初始化方法中调用它也不是一个好习惯,因为这些方法是为初始化布局和应用程序而保留的。

您可以在 onCreate() 或 onStart() 之一中执行以下操作,以确保完成后播放。

// delaying play until after all application initialization is done
    findViewById(R.id.main_page_layout).post(new Runnable() {
       public void run() {
         //play your music here
       }
    });

enter image description here

关于android - MediaPlayer.start() 不能在构造函数中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571118/

相关文章:

Android MediaPlayer 仅播放 m3u8 音频流

Android 音频混响示例应用

java - 授予互联网权限后 WebView 未加载?

java - 如何使用 bundle 将多维数组列表传递给另一个 Activity

Android:如何创建视频播放器?

android - Exoplayer播放m3u8文件Android

android - 媒体播放器错误 (1, -1004)

java - 从 fragment 类访问非 Activity 类中的共享首选项

java - Android studio 预期的类或包

c# - 我将如何使用带有媒体播放器的包 uri 资源?