Javascript-форум (https://javascript.ru/forum/)
-   Мобильный JavaScript (https://javascript.ru/forum/mobile/)
-   -   Android + JS + Audio (https://javascript.ru/forum/mobile/52909-android-js-audio.html)

CEMA 12.01.2015 17:11

Android + JS + Audio
 
Доброго времени суток, уважаемые форумчане!

При разработке одной странички возникла проблема с хитрым элементом Audio. Суть проблемы такова:
Необходимо воспроизвести некий файл из группы файлов, в зависимости от некоторых данных на странице, которые могут измениться. В функции-обработчике события при изменении вызывается функция воспроизведения. Но ничего не воспроизводится...

Объект испытаний: Планшет на базе ОС Android 4.4.2, браузер Google Chrome

Код функции и ее вызов происходят так:

var playing = 0;
function PlaySound()
{
	if (playing != 0) return;
	
	var Sound = new Audio();
	Sound.src = Sounds[InputData];
	Sound.onended = function() {
									playing = 0;
									console.log("PL = 0\r\n");
								};
	
	playing = 1;
	console.log("PL = 1\r\n")
	
	Sound.load();
	Sound.play();
}

...бла-бла-бла...

PlaySound();


Провожу отладку через JSConsole на компьютере и вижу следующее:
PL = 1
...и больше ничего. Ни звука, ни каких-либо сообщений об ошибке.

Пишу в консоли: playing = 0
Делаю так, чтобы событие произошло и история повторяется...

Добавляю кнопку, для "принудительного" вызова функции (данные ВСЕГДА находятся в диапазона массива Sounds), нажимаю и... Звук есть и в консоли вижу все, что нужно:
PL = 1
PL = 0

Может кто сталкивался с этой проблемой и может что-нибудь подсказать?

Octane 12.01.2015 17:28

…
Sound.oncanplay = function () {
    Sound.play();
};
…

CEMA 12.01.2015 19:24

Пробовал... Результат тот же... Вернул обратно, т.к. считаю, что это событие бесполезно, если файл хранится в переменной, в кодировке Base64 с описанием MIME-типа audio/mpeg

CEMA 13.01.2015 14:26

Нашел такую особенность...
Вызов функции делался так:
if (LastParam != Param) PlaySound();

Это, очевидно, нужно для того, чтобы при обработке этого события, озвучивался параметр только при его изменении. НО... Если условие убрать и оставить только вызов PlaySound, то звук есть.

Может я чего-то совсем не понимаю?! Или есть какая особенность?
Ну же, профессионалы, помогите новичку разобраться и выполнить поставленную задачу :)

CEMA 14.01.2015 11:20

Упрощаем и изменяем задачу до нельзя, чтобы понять проблему. Функция:
function PlaySound()
{
	var Sound = new Audio();
	Sound.src = Sounds[1];
	Sound.load();
	Sound.oncanplay = function() {
							Sound.play();
							console.log("ok\r\n");
						 };
	console.log("loading...");
}


Если вызываю функцию по кнопке - звук есть, в консоли вижу "loading...ok".

Если вызываю по таймеру:
setInterval("PlaySound();", 5000);

Звука нет, но в консоли вижу "loading...ok".

Неужели никто не сталкивался? Может хоть идеи какие будут?

CEMA 14.01.2015 15:49

С неоценимой помощью форумчан, а так же чуть-чуть интернета и спецификаций различного рода, причина такого недуга была найдена. Если у кого-то еще будет подобная заморочка, вот причина: в соответствии с непонятными политиками операционных систем Android и iOS, медиа на странице не может работать без предшествующего включению "тапа" по экрану. А дальше думайте сами :)

igor-tv 19.08.2015 19:00

Цитата:

Сообщение от CEMA (Сообщение 351378)
С неоценимой помощью форумчан, а так же чуть-чуть интернета и спецификаций различного рода, причина такого недуга была найдена. Если у кого-то еще будет подобная заморочка, вот причина: в соответствии с непонятными политиками операционных систем Android и iOS, медиа на странице не может работать без предшествующего включению "тапа" по экрану. А дальше думайте сами :)

А не подскажите, как включить "тап"?

Маэстро 20.08.2015 15:33

Цитата:

Сообщение от igor-tv (Сообщение 384839)
А не подскажите, как включить "тап"?

-пальчиком тапнуть по экрану ;)


Часовой пояс GMT +3, время: 17:26.