Страница 1 из 1
Воспроизводим звук
Добавлено: 22 июл 2012, 20:20
krotov
Добрый день. Понадобилось написать одну простенькую прогу на андроид. С java до этого не был знаком. Разобрался почти во всем что мне нужно, кроме звука. Необходимо программно воспроизводить один из 14 .wav файлов. Сделал пока "влоб"
1.Описываю 14 объектов MediaPlayer
MediaPlayer mp0;
...
MediaPlayer mp13;
2. Создаю массив
MediaPlayer [] mp= {mp0,mp1,mp2,mp3,mp4,mp5,mp6,mp7,mp8,mp9,mp10,mp11,mp12,mp13};
3. Создаю элементы массива
mp[0]=MediaPlayer.create(this, R.raw.w0);
...
mp[13]=MediaPlayer.create(this, R.raw.w13);
4. Вызываю когда нужно
mp[N].start();
Понимаю что это ужасно коряво, подскажите как сделать правильно и в каком блоке кода я должен освобождать объекты MediaPlayer
Спасибо
Re: Воспроизводим звук
Добавлено: 22 июл 2012, 22:39
Finch
а почему 6ы не создать плеер 1 раз и давать ему разные файлы когда нужно ?
Re: Воспроизводим звук
Добавлено: 23 июл 2012, 06:20
krotov
Finch писал(а):а почему 6ы не создать плеер 1 раз и давать ему разные файлы когда нужно ?
А можно ссылки на примеры? Те что я нашел, не помогли мне создать рабочий код
Re: Воспроизводим звук
Добавлено: 23 июл 2012, 08:19
andev
Код: Выделить всё
class SomeClass {
MediaPlayer mp;
public void playSound(int number) {
int fileId = -1;
switch(number) {
case 0: fileId = R.raw.mp0; break;
case 1: fileId = R.raw.mp1; break;
...
case 13: fileId = R.raw.mp13; break;
}
if (fileId != -1) {
mp.create(this, fileId);
mp.start();
}
}
}
Re: Воспроизводим звук
Добавлено: 23 июл 2012, 10:36
krotov
Большое спасибо. Заработало только когда я вместо
mp.create(this, fileId);
написал
mp=MediaPlayer.create(this, fileId);
Я правильно понимаю что в данном случае (при создании объекта внутри функции playSound), по ее завершению объект MediaPlayer убивается системой автоматически?
Re: Воспроизводим звук
Добавлено: 23 июл 2012, 19:35
Finch
нет, нужно вызывать mp.release(); когда выходишь из приложения
Код: Выделить всё
@Override
protected void onDestroy() {
mp.release();
super.onDestroy();
}
Re: Воспроизводим звук
Добавлено: 24 июл 2012, 09:19
krotov
Finch писал(а):нет, нужно вызывать mp.release(); когда выходишь из приложения
Тогда не совсем понятно, ведь судя по коду объект MediaPlayer создается при каждом вызове функции playSound(). Если при завершении функции он не убивается, значит каждый вызов порождает новый объект и их нужно как-то убивать самому. как?
Столкнулся с тем, что после 20-го вызова функции воспроизведения приложение вылетает по ошибке. Не может быть причина именно в этом? Как исправить?
Попробовал так
Код: Выделить всё
mp=MediaPlayer.create(this, fileId);
mp.start();
try {Thread.sleep(2000);}
catch (InterruptedException e) {
e.printStackTrace();
}
mp.release();
Прога больше не вылетает, но опять как-то криво получилось. Как все таки грамотно сделать???
Re: Воспроизводим звук
Добавлено: 24 июл 2012, 09:41
rezak90
побольше почитай доки, там очень много написано про медиаплеер, главное понять диаграмму состояний. "В любом случае, при завершении процесса проигрывания необходимо
вызвать метод release из объекта MediaPlayer, чтобы освободить соответ-ствующие ресурсы" - это тебе из Рето Майера, там не много но можешь почитать. И в конце концов если ошибки вылетают то пости их сюда, телепаты в отпуске

Re: Воспроизводим звук
Добавлено: 24 июл 2012, 14:09
Finch
krotov, есть прекрасный интерфейс
OnCompletionListener
Код: Выделить всё
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
// твои действия
}
});