Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture

Tags:

I'm making a music playing page, where I use SoundManager 2 for AngularJs. I'm using a remote API to get a song URL to play. I enhanced an angular-soundmanager2 click event handler :

element.bind('click', function () {     if (angular.isFunction(scope.loadFunction)) {         scope.loadFunction(scope.song, function () {             $log.debug('adding song to playlist');             addToPlaylist(scope.song.playDetails);          })     } else {         $log.debug('adding song to playlist');         addToPlaylist(scope.song);     } }); 

Where I added a part, that calls scope.loadFunction(song,callback) and after this function loads a song URL it calls a callback to give the control back to angular-soundmanager2.

The problem is that on chrome for android I get an error :

Failed to execute 'play' on 'HTMLMediaElement': API can only be initiated by a user gesture. 

it doesn't happen if a song has a URL from the beginning and async loading isn't used.

Are there any workarounds for it?

like image 324
andreybavt Avatar asked Sep 06 '15 14:09

andreybavt


1 Answers

I had to experiment with Chrome playing sounds. It turned out that even after a user gesture (such as click) it waits for 1000ms and if no sound was played it throws the exception above. In my case the problem was coming from asynchronous track URL loading.

But it also turned out that after the first track is played chrome doesn't care anymore for this 1000ms delay and you can call play programmatically with any timeout you want.

So the solution was to play a micro almost zero-second long muted sound from static resources after the very first time a user clicks on a track and after that load a desired track URL.

Hope it helps or someone finds other solutions.

like image 60
andreybavt Avatar answered Oct 01 '22 02:10

andreybavt