Mediaplayer错误(-38,0)和错误(1,-1010)。

4

我正在尝试让媒体播放器工作,但在第一次安装时,音乐不会开始播放(我认为这是由于需要可视化器的权限)。但之后每次都可以正常播放。

代码:

    mPlayer = MediaPlayer.create(this, R.raw.bik);
    mPlayer.setLooping(true);
    mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

日志信息:

11-23 17:18:29.979 28329-28329/com.waro.blockevader E/MediaPlayer: Error (-38,0)
11-23 17:18:29.979 28329-28329/com.waro.blockevader E/MediaPlayer: Error (-38,0)
11-23 17:18:29.979 28329-28329/com.waro.blockevader E/MediaPlayer: Error (1,-1010)
11-23 17:18:29.979 28329-28329/com.waro.blockevader E/MediaPlayer: Error (-38,0)
11-23 17:18:29.979 28329-28329/com.waro.blockevader V/MediaPlayer[Native]: isPlaying: 0
11-23 17:18:29.979 28329-28329/com.waro.blockevader E/MediaPlayer: Error (-38,0)

文件格式为 .mp4
感谢您的帮助。
编辑:
我所说的每次之后是指;
每次在我授予权限并重新启动应用程序后,音乐都可以正常播放,没有出现错误。
权限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

“但是之后每次播放都很正常”这句话是什么意思? - MikeOscarEcho
抱歉,还是太模糊了。 你的应用程序授予了哪些权限? 你是在Activity的onCreate()方法中启动视频吗? - MikeOscarEcho
我在onResume()中开始播放音乐,但是在onCreate()中也出现了相同的错误。我已经授予RECORD_AUDIO和MODIFY_AUDIO_SETTINGS权限。 - Ellisan
2个回答

5
你遇到了两个不同的错误。第一个错误是:
E/MediaPlayer: Error (-38,0) 

这意味着您尝试在未准备好MediaPlayer的情况下调用它。

第二个错误

E/MediaPlayer: Error (1,-1010)

意味着媒体不受支持。您可以在此处查看错误代码这里


但是我调用了onPrepared()吗?如果我没有调用它,那么为什么在我授予权限并重新启动应用程序后它能够工作呢?错误号2也是一样的情况。在权限被授予后重新启动应用程序时,两者都不会显示。 - Ellisan
@dh19 这就是错误的含义。根据提供的信息,我无法告诉你更多的内容。 - Murat Karagöz
我明白,但那并不能真正解决我的问题:/ - Ellisan
哇,检查错误代码名称的链接太棒了。我以前从未能够解密错误代码并认为它们是无用的。这是一个很好的帮助! - Marcin Koziński
1
我在收听大约20分钟的广播流(HLS)后出现“E/MediaPlayer: Error (1,-1010)”错误。有任何想法为什么会这样?(如果是不支持的格式,mediaPlayer会立即抛出该错误,而不是在20分钟后) - Starwave

1
我通过更改onResume()中的一部分来修复了它。
正如预期的那样,确实是权限引起的混乱, 我有:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {
        if (!mPlayer.isPlaying() && !mpCreated) {
            initTunnelPlayerWorkaround();
            init();
        } else {
            mPlayer.start();
            mVisualizerView.link(mPlayer);
        }
    } else {
        cleanUp();
        mPlayer.start();
        Log.i("boop","biep");
    }

最终通过日志发现它进入了else语句,这意味着它正在调用cleanUp()方法。

在cleanUp()方法中我有:

private void cleanUp() {
    if (mPlayer != null) {
        mVisualizerView.release();
        if(!mPlayer.isPlaying()) {
            mPlayer.pause();
        }
    }
}

第二个if语句引起了混乱(显然),我通过将其更改为以下内容来解决了这个问题:
private void cleanUp() {
    if (mPlayer != null) {
        mVisualizerView.release();
        if(mPlayer.isPlaying()) {
            mPlayer.pause();
        }
}

我知道这是一个奇怪而具体的答案,但也许有人曾经遇到相同的问题,可以找出原因。祝大家愉快,感谢你们的帮助。 ~Waro(dh19,可惜不能使用waro)

1
很高兴你解决了问题!正如你在原帖中所看到的,我们很难帮助你进行调试。这个答案中的代码在你的原帖中根本找不到。我知道有时候你只需要大声思考,但是下次请尝试发布所有相关的代码 :) - MikeOscarEcho
2
说实话,我不知道这是导致问题的部分,但下次我会尽量更具体 :) - Ellisan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接