Подтвердить что ты не робот

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
4b9b3361

Ответ 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" />