MediaPlayer: должен быть установлен контроллер субтитров: KitKat
У меня возникает странная проблема, когда иногда звучит звуковой файл, а иногда и не воспроизводится. Уловка заключается в том, что когда он решает не играть, 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
Ответы
Ответ 1
Глядя на предыдущее обсуждение на StackOverflow и ссылающийся фиксация Android где это было введено, приведенный выше код не может полностью инициализировать объект MediaPlayer
.
Пример кода KitKat для воспроизведения мультимедиа предполагает, что вы должны позвонить:
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
сразу после создания MediaPlayer
и перед вызовом его метода setDataSource
.
Ответ 2
У меня была такая же проблема, и я исправил ее, добавив следующее сразу после создания экземпляра MediaPlayer.
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (mp == mediaPlayer) {
mediaPlayer.start();
}
}
});
Ранее я реализовал MediaPlayer.OnPreparedListener и переопределял onPrepared(), но это не сработало.
Надеюсь, это поможет!
Ответ 3
С тех пор я работал над этим приложением. Вот что я сделал, чтобы заставить это работать. (Протестировано на KitKat и Lollipop). Я думаю, что переход от 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();
}
}
Ответ 4
Это должно исправить вашу проблему (сделал для меня): замените строку, которая говорит "player.start()", следуя остальной части вашего кода с помощью асинхронного обратного вызова:
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
Эта ошибка - это просто Log.e, а не реальная ошибка. Это не должно приводить к тому, что ваш плеер не играет, я предполагаю, что это произошло только потому, что игрок не закончил подготовку, когда вы пытаетесь вызвать start().
E/MediaPlayer﹕ Should have subtitle controller already set
Ответ 5
установленный в файле манифеста, может помочь вам
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />