【问题标题】:Android MediaPlayer throws error after 30 playsAndroid MediaPlayer 播放 30 次后抛出错误
【发布时间】:2017-11-29 22:14:13
【问题描述】:

好的,我正在编写一个简单的呼叫/拨号应用程序,并为每个号码创建了按钮。我正在尝试使用 MediaPlayer 类实现声音,因此每当用户单击/点击按钮声音时都会播放。它正在工作,但是在点击 30 次后没有播放声音,只有当我重新启动应用程序时,我才能在停止后再次听到 30 次点击的声音,然后我得到了错误。

我也尝试过使用 SoundPool 类,但在单击 30 次后我再次听不到声音。有什么解决办法吗?

onButtonClick 方法:

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.button_sound);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

        try {
            if (mp.isPlaying()) {
                mp.stop();
                mp.release();
            } else {
                mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                            mp.start();
                    }
                });
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

错误日志:

11-29 23:01:03.632 12572-12572/com.phonecalldemo E/MediaPlayer-JNI: QCMediaPlayer 媒体播放器不存在 11-29 23:01:03.662 12572-12572/com.phonecalldemo E/MediaPlayer:应该有字幕 控制器已设置 11-29 23:01:03.672 12572-12572/com.phonecalldemo E/MediaPlayer: 错误 (-19, 0) 11-29 23:01:03.682 12572-12572/com.phonecalldemo E/MediaPlayer: 错误 (-19,0)

【问题讨论】:

  • 我无法告诉您发生这种情况的具体原因,但为什么会有 30 次点击?每次都是同一个号码吗?是否有可能发生了某些事情,例如您的设备旋转了?另外,您应该将this 作为上下文,而不是getApplicationContext(),这可能是问题的一部分。 (这是本身就是一个上下文的活动)
  • 是的,或多或少有 30 次点击(1-3 次不同)。没有设备不旋转,我在我的活动中将屏幕方向设置为纵向。我将 getApplicationContext 更改为“this”,它仍然是一样的。我收到那个错误:E/MediaPlayer: 应该已经设置了字幕控制器 11-30 11:40:57.080 12114-12114/com.phonecalldemo E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
  • 在 Google 上查找 MediaPlayer: Should have subtitle controller already set 我已经找到了很多关于此的问题和答案。
  • @NicolasMaltais 我自己找到了解决方案,添加了新回复。

标签: android


【解决方案1】:

更新:

我已经找到了解决方案,这是我的新代码,对于那些仍然遇到这种错误的人:

final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.button_sound);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

                mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.start();
                    }
                });
                mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mediaPlayer) {
                        mp.release();
                    }
                });

【讨论】:

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