Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Web Share API level 2 DOMException: Permission denied

I am fetching an img, turning it into a file, and then trying to share that file. I tested the code on latest Chrome on Android (the only browser to currently support this API).

  if (shareimg && navigator.canShare) {
    share = async function() {
      const response = await fetch(shareimg);
      const blob = await response.blob();
      const file = await new File([blob], "image.jpeg");

      navigator.share({
        url: shareurl,
        title: sharetitle,
        text: sharetext,
        files: [file]
      });
    };
  }

I am running the function in response to a user clicking a button (the share() method must be called from a user gesture, otherwise it won't work).

(I am testing this code using Browserstack, which provides a console for javascript errors, as I couldn't successfully link my Android device to my mac for debugging and this API only works on mobile phones - not on Chrome for desktop.)

like image 437
Ollie Williams Avatar asked Nov 08 '19 12:11

Ollie Williams


People also ask

What is webshare API?

The Web Share API allows a site to share text, links, files, and other content to user-selected share targets, utilizing the sharing mechanisms of the underlying operating system. These share targets typically include the system clipboard, email, contacts or messaging applications, and Bluetooth or Wi-Fi channels.

What is a Webshare?

Web sharing (also known as "screen sharing" and "desktop sharing") is a software function that allows a stream of data to be shared across the Internet to one or more devices. While the term can refer to the exchange of any kind of data, usually it refers to shared screen and audio data.

How do you share in Javascript?

To share files, first test for and call navigator. canShare() . Then include the list of files in the call to navigator. share() .


1 Answers

Your code can be optimized a bit. It is currently necessary to specify the MIME type of the blob. You can check the code below out in practice here: https://statuesque-backpack.glitch.me/.

if ('canShare' in navigator) {
  const share = async function(shareimg, shareurl, sharetitle, sharetext) {
    try {
      const response = await fetch(shareimg);
      const blob = await response.blob();
      const file = new File([blob], 'rick.jpg', {type: blob.type});

      await navigator.share({
        url: shareurl,
        title: sharetitle,
        text: sharetext,
        files: [file]
      });
    } catch (err) {
      console.log(err.name, err.message);
    }
  };

  document.querySelector('button').addEventListener('click', () => {
    share(
      'https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Rick_Astley_Dallas.jpg/267px-Rick_Astley_Dallas.jpg',
      'https://en.wikipedia.org/wiki/Rick_Astley',
      'Rick Astley',
      'Never gonna give you up!'
    );
  });  
}
like image 84
DenverCoder9 Avatar answered Oct 19 '22 21:10

DenverCoder9