Android MediaPlayer:应已设置字幕控制器:KitKat

Android MediaPlayer:应已设置字幕控制器:KitKat,android,android-mediaplayer,android-4.4-kitkat,Android,Android Mediaplayer,Android 4.4 Kitkat,我有一个奇怪的问题,我的音频文件有时播放,有时不播放。问题是,当它决定不玩时,DDMS会给我一个: E/MediaPlayer﹕ Should have subtitle controller already set 因为这是一对一的音乐没有播放,我已经确定这可能是问题所在 如果音乐没有播放,我按了音量按钮,它开始播放。 如果我等待大约30秒没有播放,它会再次开始(不循环) 这是怎么回事?我在KitKat使用 player = new MediaPlayer();

我有一个奇怪的问题,我的音频文件有时播放,有时不播放。问题是,当它决定不玩时,DDMS会给我一个:

E/MediaPlayer﹕ Should have subtitle controller already set
因为这是一对一的音乐没有播放,我已经确定这可能是问题所在

如果音乐没有播放,我按了音量按钮,它开始播放。 如果我等待大约30秒没有播放,它会再次开始(不循环)

这是怎么回事?我在KitKat使用

        player = new MediaPlayer();
        AssetFileDescriptor afd = null;
        try {
            afd = getAssets().openFd("Theme.mp3");
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            player.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        player.setLooping(true); //restart playback end reached
        //player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0
        player.start(); //start play back
查看一个on-StackOverflow,以及引入它的引用位置,上面的代码可能无法完全初始化
MediaPlayer
对象

用于媒体播放的建议您应调用:

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

在构造
MediaPlayer
之后,在调用其
setDataSource
方法之前。

这应该可以解决您的问题(为我做了):用异步回调替换代码其余部分后面的“player.start()”行,如下所示:

player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        mediaPlayer.start();
    }
});
这个错误只是一个Log.e,不是真正的错误。这不应该导致您的播放器无法播放,我猜这只是因为当您尝试调用start()时,播放器尚未完成准备


我也有同样的问题,我通过在实例化MediaPlayer之后添加以下内容来修复它

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        if (mp == mediaPlayer) {
                            mediaPlayer.start();
                        }
                    }
                });
之前,我实现了MediaPlayer.OnPreparedListener并重写了onPrepared(),但它不起作用


我希望这有帮助

我已经很久没有开发这个应用了。下面是我为让这一切正常运转而做的事情。(在KitKat和棒棒糖上测试)。我认为从MediaPlayer切换到APMediaPlayer是其中的一部分

@Override
public void onDestroy() {
    if(player != null) {
        player.release();
        player = null;
    }
    super.onDestroy();
}


@Override
public void onStart() {
    super.onStart();
    if(player != null) {
        player.start();
    }
    else {
        player = new APMediaPlayer(this); //create new APMediaPlayer
        player.setMediaFile("Theme.mp3"); //set the file (files are in data folder)
        player.start(); //start play back
        player.setLooping(true); //restart playback end reached
        player.setVolume(1, 1); //Set left and right volumes. Range is from 0.0 to 1.0
    }

}

@Override
public void onResume() {
    super.onResume();
    if(player != null) {
        player.start();
    }

}

在清单文件中设置可能对您有所帮助

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


这没有改变任何事情。我不完全确定当时发生了什么。log语句不足以单独停止程序;唯一能做到这一点的Android日志是
log.wtf
。也许问题与上面发布的代码如何调用有关?可能是。我正在运行处理(扩展pApplet)并在destroy onPause等上调用Overwriten onStart上的播放器逻辑…尽管这更具推测性-我从未使用过处理-您可能会考虑使用MediaPlayer。处理程序在运行时试图处理应用程序线程的方式与同步MediaPlayer调用期望处理线程的方式之间可能存在冲突。我使用google推荐的代码,包括setAudioStreamType(),但仍然收到此错误。在主线程和异步中尝试了它。同样的错误。不,这没有影响。我在这里遇到了同样的问题,我的代码过去运行得很好。现在,在看到错误日志后,我立即停止了(音频,而不是应用程序--应用程序很好,例如,我可以启动另一个音频曲目)。你找到解决问题的方法了吗?可能是“对不起,我也是”的重复,但是,你解决了吗?我在这里面临同样的问题,只有5.0棒棒糖。同样的代码以前从未失败过,在4.4.4的模拟器中也不会失败。这个问题的每个答案都不起作用。不要浪费你的时间。你想要这样:这对OP提供的问题没有影响。这绝对与问题无关。
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />