I am working on SAAS solution and I need customers to receive notification sounds from the application. Even if they just launched it without any interaction with it. Google has changed Chrome behaviour regarding this aspect and now user is required to click on webpage to get notification sounds. I have found out that it is possible to allow sounds explicitly here:
and then user should enable sounds explicitly for your websites:
Now user will not have to click to enable sound notifications. My question: is it possible to request user permission for sound the same way we do it for microphone:
To allow the Sound Access on Chrome Computer, tap on the three dots at the top right corner of the screen and then open the settings. From there open the Privacy and Security section, and tap on Site settings. From Site, settings scroll down and open the additional content settings, under it open the Sound option.
Simply make your own alert modal. You can feature detect if it is required or not by trying to play your audio while muted
const audio = new Audio( 'https://dl.dropboxusercontent.com/s/h8pvqqol3ovyle8/tom.mp3' );
audio.muted = true;
const alert_elem = document.querySelector( '.alert' );
audio.play().then( () => {
// already allowed
alert_elem.remove();
resetAudio();
} )
.catch( () => {
// need user interaction
alert_elem.addEventListener( 'click', ({ target }) => {
if( target.matches('button') ) {
const allowed = target.value === "1";
if( allowed ) {
audio.play()
.then( resetAudio );
}
alert_elem.remove();
}
} );
} );
document.getElementById( 'btn' ).addEventListener( 'click', (e) => {
if( audio.muted ) {
console.log( 'silent notification' );
}
else {
audio.play();
}
} );
function resetAudio() {
audio.pause();
audio.currentTime = 0;
audio.muted = false;
}
.alert {
font: 14px Arial, sans-serif;
position: fixed;
top: 0;
left: 0;
background: white;
border: 1px solid lightgray;
box-shadow: 3px 3px 12px lightgray;
}
p { margin: 12px; }
.alert .buttons {
float: right
}
<div class="alert">
<p>This webpage would like to play sounds</p>
<p class="buttons">
<button value="0">Block</button>
<button value="1">Allow</button>
</p>
</div>
<button id="btn">trigger notification</button>
Ps: note that there is a "speaker"
value in Permissions API specs, but this one is for allowing devices through HTMLMediaElement.setSinkId()
method, which is yet another beast. (you can see this Q/A if you are interested in this not yet implemented feature).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With