Воспроизводим звук

Ответить
krotov
Сообщения: 4
Зарегистрирован: 22 июл 2012, 20:10

Воспроизводим звук

Сообщение krotov » 22 июл 2012, 20:20

Добрый день. Понадобилось написать одну простенькую прогу на андроид. С 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

Спасибо

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Воспроизводим звук

Сообщение Finch » 22 июл 2012, 22:39

а почему 6ы не создать плеер 1 раз и давать ему разные файлы когда нужно ?
CEO of a company R.id.team

krotov
Сообщения: 4
Зарегистрирован: 22 июл 2012, 20:10

Re: Воспроизводим звук

Сообщение krotov » 23 июл 2012, 06:20

Finch писал(а):а почему 6ы не создать плеер 1 раз и давать ему разные файлы когда нужно ?
А можно ссылки на примеры? Те что я нашел, не помогли мне создать рабочий код

Аватара пользователя
andev
Сообщения: 219
Зарегистрирован: 13 янв 2012, 17:56

Re: Воспроизводим звук

Сообщение andev » 23 июл 2012, 08:19

Код: Выделить всё

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();
		}
	}
}

krotov
Сообщения: 4
Зарегистрирован: 22 июл 2012, 20:10

Re: Воспроизводим звук

Сообщение krotov » 23 июл 2012, 10:36

Большое спасибо. Заработало только когда я вместо

mp.create(this, fileId);

написал

mp=MediaPlayer.create(this, fileId);

Я правильно понимаю что в данном случае (при создании объекта внутри функции playSound), по ее завершению объект MediaPlayer убивается системой автоматически?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Воспроизводим звук

Сообщение Finch » 23 июл 2012, 19:35

нет, нужно вызывать mp.release(); когда выходишь из приложения

Код: Выделить всё

@Override
    protected void onDestroy() {
        mp.release();
        super.onDestroy();
    }
CEO of a company R.id.team

krotov
Сообщения: 4
Зарегистрирован: 22 июл 2012, 20:10

Re: Воспроизводим звук

Сообщение krotov » 24 июл 2012, 09:19

Finch писал(а):нет, нужно вызывать mp.release(); когда выходишь из приложения
Тогда не совсем понятно, ведь судя по коду объект MediaPlayer создается при каждом вызове функции playSound(). Если при завершении функции он не убивается, значит каждый вызов порождает новый объект и их нужно как-то убивать самому. как?

Столкнулся с тем, что после 20-го вызова функции воспроизведения приложение вылетает по ошибке. Не может быть причина именно в этом? Как исправить?

Попробовал так

Код: Выделить всё

    	        mp=MediaPlayer.create(this, fileId); 
        	mp.start(); 
        	try {Thread.sleep(2000);} 
        	catch (InterruptedException e) {
                e.printStackTrace();
            }
        	mp.release();
Прога больше не вылетает, но опять как-то криво получилось. Как все таки грамотно сделать???

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Воспроизводим звук

Сообщение rezak90 » 24 июл 2012, 09:41

побольше почитай доки, там очень много написано про медиаплеер, главное понять диаграмму состояний. "В любом случае, при завершении процесса проигрывания необходимо
вызвать метод release из объекта MediaPlayer, чтобы освободить соответ-ствующие ресурсы" - это тебе из Рето Майера, там не много но можешь почитать. И в конце концов если ошибки вылетают то пости их сюда, телепаты в отпуске :mrgreen:
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Воспроизводим звук

Сообщение Finch » 24 июл 2012, 14:09

krotov, есть прекрасный интерфейс OnCompletionListener

Код: Выделить всё

mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        // твои действия
    }
});
CEO of a company R.id.team

Ответить