hi ive работал над моим приложением и нашел препятствие в деятельности, которую я просто не могу преодолеть. деятельность по существу является большим новинкой фортепиано с 8 клавишами, которые воспроизводят звуки, есть шесть кнопок на стороне, которые меняют изображение нот и самих нот, это я сделал 🙂 Теперь я хотел бы добавить фоновую песню для каждого другой набор заметок (инструментов) только в случае сбоев приложения, я установил медиаплеер в верхней части (глобально?) с помощью MediaPlayer mp; MediaPlayer mp2; и т.д., и im, используя это в своем коде, чтобы проверить, не играет ли какая-либо музыка, остановить ее, отпустить, а затем сыграть кусок, который я хочу,
if(mp!=null&&mp.isPlaying()){
mp.stop();
mp.release();
}
if(mp2!=null&&mp2.isPlaying()){
mp2.stop();
mp2.release();
}
if(mp3!=null&&mp3.isPlaying()){
mp3.stop();
mp3.release();
}
mp3 = MediaPlayer.create(MusicActivity.this, R.raw.snaps);
mp3.setLooping(true);
mp3.start();
это снова работает, но происходит от одного к другому, а затем обратно приводит к сбою приложения. есть ли что-то еще, что я должен делать? или это просто ошибка из памяти?
EDIT– Благодаря ranjk89 за помощь
изменено на soundpools, но они не остановятся. ranjk89 предлагает ссылаться на идентификатор потока, а не на звуковой идентификатор, который ищет немного больше разъяснений, если возможно, у меня есть
farmback =0;
drumback =0;
вверху, затем загружается в oncreate, используя
drumback = sp.load(this, R.raw.snaps,1);
farmback = sp.load(this, R.raw.oldmacdonaldbeta,1);
а затем вниз, в том же методе, я меняю значки кнопок, а не тот же метод, я меняю все свои другие звуки для своих заметок, которые я вызываю
sp.stop(drumback);
sp.play(farmback, 1, 1, 0, -1, 1);
в одном и
sp.stop(farmback);
sp.play(drumback, 1, 1, 0, -1, 1);
в другой, но есть 6 различных инструментов в общей сложности, что все нуждаются в другой бэк-трек, который должен остановить, когда прибор изменяется и воспроизвести одну связанную с ней так что-то вроде
if (sp !=null && sp.isplaying()){
sp.stop();
sp.play(dumback);
}
но, очевидно, это невозможно.
Моя первоначальная реакция заключается в том, что вы не должны использовать несколько MediaPlayer в первую очередь.
Я предлагаю вам использовать SoundPool, поскольку вы можете сначала загрузить все носители (аудио), как только они будут загружены, вы можете играть их по своему усмотрению. Кроме того, у вас не будет нескольких игроков, которые уменьшат сложность вашего кода.
Но если вы хотите использовать Media Player,
Смотрите это. Но имейте в виду, что после освобождения вы не сможете повторно использовать этот экземпляр MediaPlayer. Даже если вы используете несколько MediaPlayers, не звоните на них, если вы не уверены, что не хотите их использовать. Используйте комбинацию stop()/prepare().
Для приложения, выполняющего слишком большую работу в главной теме,
Если вы используете SoundPool или только один MediaPlayer и все еще сталкиваетесь с той же проблемой, используйте AsyncTask. Android-сайт разработчика имеет очень хорошее руководство по этому