После вызова mediaplayer.stop() Я не могу снова запустить звук. Интерпретировать ссылку на разработчика для меня?

#java #android #media-player

#java #Android #Медиаплеер

Вопрос:

вот несколько цитат из ссылки на разработчика, которые после прочтения не могут заставить мой звук в игре работать. Может быть, вы можете мне помочь?

«после перехода в остановленное состояние воспроизведение не может быть запущено до тех пор, пока не будут вызваны prepare() или prepareAsync (), чтобы снова перевести объект MediaPlayer в подготовленное состояние».

В моем классе заставки я использую Media Player .create, чтобы найти ресурс и подготовить его. Затем я продолжаю воспроизведение и останавливаю его. Я использую .reset после его остановки.

пример.

 private MediaPlayer mpSplash;
mpSplash = MediaPlayer.create(this, R.raw.splashscream);
mpSplash.start();
mpSplash.stop();
mpSplash.reset();
  

В моем игровом цикле в моем классе character я снова использую create для новой переменной медиаплеера, чтобы загрузить и подготовить другой звук. Когда я использую Start, мои программы выдают ошибку, поэтому я пытаюсь вручную подготовить ее до с помощью .prepare, и это показывает красную строку, указывающую на ошибку ввода-вывода. Я попробовал .prepareasync и это также не сработало.

пример.

 private MediaPlayer mpBearHurt;
mpBearHurt =  MediaPlayer.create(cxt, R.raw.bear_hurt);
mpBearHurt.reset();
mpBearHurt.prepareAsync();
mpBearHurt.start();
  

Вот ссылка на ресурсы разработчика…
http://developer.android.com/reference/android/media/MediaPlayer.html

В конце концов, независимо от того, как я меняю местами и пытаюсь подготовить и сбросить, а что нет, я не могу заставить свою программу не закрываться принудительно.

Спасибо, и я надеюсь, что мы сможем работать вместе, чтобы решить эту проблему!

Комментарии:

1. mpBearHurt это новый mediaplayer, он не находится в остановленном состоянии. Проблема в любой ошибке, которую вы получаете при вызове mpBearHurt.start() . Пожалуйста, опубликуйте ошибку.

Ответ №1:

Швиц понял. Если вы не используете потоковую передачу, вы обычно можете просто использовать prepare() . Я бы рекомендовал не создавать новые экземпляры постоянно. Вместо этого вы можете просто установить источник данных существующего проигрывателя и повторно использовать его. Например:

 MediaPlayer mp = new MediaPlayer();
AssetFileDescriptor bearAfd = getResources().openRawResourceFd(R.raw.bear_hurt);
AssetFileDescriptor screamAfd = getResources().openRawResourceFd(R.raw.splashscream);

mp.setDataSource(bearAfd.getFileDescriptor(), bearAfd.getStartOffset(), bearAfd.getLength();
mp.prepare();
mp.start();

//then to set it to another one
mp.setDataSource(screamAfd.getFileDescriptor(), screamAfd.getStartOffset(), screamAfd.getLength();
mp.prepare();
mp.start();
  

Как только вы начнете создавать слишком много медиаплееров, у вас, вероятно, закончится память или перегрузится звуковое оборудование, и вы получите множество, казалось бы, случайных ошибок и сбоев.

Ответ №2:

Если вы вызываете, prepareAsync то вы не можете вызвать start непосредственно после этого, вы должны использовать OnPreparedListener обратный вызов для определения того, когда вызывать start . В качестве альтернативы вы могли бы просто вызвать prepare вместо этого.

Комментарии:

1. Почему у него проблемы с моим вызовом prepare();?

2. @Kirk Becker проблема в том, что вы не вызываете, prepare вы вызываете prepareAsync , поэтому, когда вы вызываете start, медиаплеер на самом деле еще не готов.

Ответ №3:

Первый комментарий — нет никакой связи между двумя объектами MediaPlayer.
(если только вы не используете фокус звука — что, похоже, здесь не так)

Проблема заключается в том, что делается во втором примере кода.

Вот как должен выглядеть второй код:

 private MediaPlayer mpBearHurt;
mpBearHurt =  MediaPlayer.create(cxt, R.raw.bear_hurt);
mpBearHurt.start();
  

Вы можете делать все, что захотите, с другим объектом MediaPlayer, вы даже можете продолжать его воспроизведение, если хотите 🙂