После вызова mediaplayer.stop () я не могу запустить звук снова.Интерпретировать ссылку на девайс для меня? - PullRequest
2 голосов
/ 22 апреля 2011

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

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

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

ех.

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

В моем игровом цикле в классе персонажей я снова использую create для новой переменной Media Player, чтобы загрузить и подготовить другой звук. Когда я использую 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

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

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

Ответы [ 3 ]

4 голосов
/ 22 апреля 2011

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

3 голосов
/ 22 апреля 2011

Швиз получил его. Если вы не транслируете, вы можете просто использовать 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();

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

0 голосов
/ 19 апреля 2013

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

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

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

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

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

...