Integrar recursos de mídia

Você pode integrar recursos de dispositivo nativo, como câmera e microfone com seu aplicativo Teams. Para integração, você pode usar a biblioteca de cliente JavaScript do Microsoft Teams que fornece as ferramentas necessárias para que seu aplicativo acesse as permissões de dispositivo de um usuário. Use APIs de recursos de mídia adequadas para integrar os recursos do dispositivo, como câmera e microfone com a plataforma do Teams em seu aplicativo Microsoft Teams, e criar uma experiência mais avançada. O recurso de mídia está disponível para cliente Web, área de trabalho e dispositivos móveis do Teams. Para integrar recursos de mídia, você deve atualizar o arquivo de manifesto do aplicativo e chamar as APIs de recursos de mídia.

Para uma integração eficaz, você deve ter um bom entendimento dos trechos de código para chamar as respectivas APIs, o que permite usar recursos de mídia nativa. É importante se familiarizar com os erros de resposta da API para lidar com os erros no seu aplicativo do Teams.

Vantagens

A vantagem de integrar recursos de dispositivo em seus aplicativos do Teams é que ele usa controles nativos do Teams para fornecer uma experiência avançada e imersiva para seus usuários. Os cenários a seguir mostram as vantagens dos recursos de mídia:

  • Permita que o usuário capture os modelos aproximados desenhados em um quadro de comunicações físico por meio do celular e use as imagens capturadas como opções de votação no chat em grupo do Teams.

  • Permita que o usuário grave a mensagem de áudio e anexe-a a um tíquete de incidente.

  • Permita que o usuário digitalize os documentos físicos do smartphone para registrar uma reclamação de seguro de carro.

  • Permita que o usuário grave um vídeo em um local de trabalho e carregue-o para atendimento.

Observação

  • O Teams não dá suporte a permissões de dispositivo na janela de bate-papo pop-out, nas guias e no painel lateral da reunião.
  • As permissões do dispositivo são diferentes no navegador. Para saber mais, consulte permissões de dispositivo do navegador.
  • O prompt de solicitação de permissões é exibido automaticamente no celular quando uma API relevante do Teams é iniciada. Para mais informações, consulte solicitar permissões de dispositivos.

Atualizar manifesto

Atualize seu aplicativo do Teams do arquivo manifest.json do adicionando a devicePermissions propriedade e especificando media. Ele permite que seu aplicativo solicite as permissões necessárias dos usuários antes que eles comecem a usar a câmera para capturar a imagem, abra a galeria para selecionar uma imagem a ser enviada como anexo ou use o microfone para gravar a conversa. A atualização para o manifesto do aplicativo é a seguinte:

"devicePermissions": [
    "media",
],

APIs de funcionalidade de mídia

As APIs captureImage, selectMedia, getMedia e viewImages permitem que você use recursos de mídia nativos da seguinte maneira:

  • Use o microfone para permitir que os usuários gravem áudio (grave 10 minutos de conversa) do dispositivo.
  • Use o controle de câmera nativo para permitir que os usuários capturem e anexem imagens e capturem vídeos (gravem até cinco minutos de vídeo) em qualquer lugar.
  • Use o suporte da galeria nativo para permitir que os usuários selecionem imagens do dispositivo como anexos.
  • Use o controle do visualizador de imagens nativo para visualizar várias imagens ao mesmo tempo.
  • Suporta transferência de imagens grandes (de 1 MB a 50 MB) através da ponte TeamsJS.
  • Suporte a recursos avançados de imagem , permitindo que os usuários visualizem e editem imagens.
  • Digitalize documentos, quadro de comunicações e cartões de visita pela câmera.

Importante

  • Você pode invocar o , selectMedia, getMedia, e viewImages APIs de várias superfícies do captureImageTeams, incluindo caixas de diálogo (chamadas de módulos de tarefas no TeamsJS v1.x), guias e aplicativos pessoais. Para obter mais informações, consulte os pontos de entrada para aplicativos do Teams.
  • A selectMedia API é compatível com os recursos de câmera e microfone por meio de diferentes configurações de entrada.
  • A selectMedia API para acessar o recurso de microfone é compatível apenas com clientes móveis.
  • A contagem máxima de imagens carregadas é determinada por maxMediaCount e também pelo tamanho total da matriz retornada pela selectMedia API. Verifique se o tamanho da matriz não excede 20 MB, se o tamanho da matriz exceder 20 MB, a API gerará um código de erro 10000 que é SIZE_EXCEEDED erro.

A tabela a seguir lista o conjunto de APIs para habilitar os recursos de mídia do dispositivo:

API Descrição
captureImage (Câmera) A API permite que os usuários ativem a câmera e capturem uma imagem ou selecionem mídia da galeria. Quando o retorno de captureImage chamada é disparado, a imagem é compartilhada como um arquivo. A API restringe os usuários a selecionar ou capturar uma única imagem para compartilhamento e é compatível apenas com clientes móveis.
selectMedia (Câmera) A selectMedia API permite que os usuários capturem ou selecionem mídia da câmera ou da galeria de seus dispositivos e, em seguida, devolvam-na ao aplicativo Web. Os usuários têm a capacidade de editar, recortar, girar, anotar ou desenhar sobre imagens antes do envio. Em resposta a selectMedia, o aplicativo Web obtém as IDs de mídia das imagens selecionadas e uma miniatura da mídia escolhida. Você pode configurar ainda mais essa API usando a configuração ImageProps .
selectMedia (Microphone) Para acessar a funcionalidade do microfone, defina o mediaType como 4 (Áudio) na selectMedia API. Essa API permite que os usuários gravem áudio usando o microfone do dispositivo e retorna os clipes gravados para o aplicativo Web. Os usuários têm a opção de pausar, regravar ou visualizar a gravação antes de enviar. Em resposta a selectMedia, o aplicativo Web recebe as IDs de mídia das gravações de áudio selecionadas.
Se você precisar definir uma duração específica para a gravação, use maxDuration. A duração atual da gravação é definida como 10 minutos, após os quais a gravação termina automaticamente.
getMedia Essa API recupera a mídia capturada pela API selectMedia em partes, independentemente do tamanho da mídia. Essas partes são montados e enviados de volta para o aplicativo Web como um arquivo ou blob. Dividir mídia em partes menores facilita a transferência de arquivos grandes.
viewImages Essa API permite que o usuário exiba imagens no modo de tela inteira como uma lista rolável.

A imagem a seguir mostra a experiência do aplicativo Web da API para o recurso de captureImage imagem no Teams móvel:

  • Inicie a câmera e capture a imagem para compartilhar:

    A imagem mostra a capacidade captureImage para dispositivos móveis.

  • Selecione a mídia da galeria para compartilhar:

    A imagem mostra a galeria móvel da funcionalidade captureImage.

Você pode exibir a experiência do aplicativo Web da API para área selectMedia de trabalho e dispositivos móveis do Teams.

A imagem a seguir mostra a experiência do aplicativo Web da API para o recurso de selectMedia imagem:

A imagem mostra a capacidade de imagem para dispositivos móveis.

Observação

Em dispositivos com versão do Android inferior a 7, a selectMedia API inicia a experiência de câmera nativa do Android em vez da experiência de câmera nativa do Teams.

A imagem a seguir mostra a experiência do aplicativo Web da selectMedia API para o recurso de microfone:

A imagem mostra a capacidade do microfone para dispositivos móveis.

Tratamento de erros

Certifique-se de lidar com esses erros adequadamente no aplicativo Teams. A tabela a seguir lista os códigos de erro e as descrições sob as quais os erros são gerados:

Código de erro Nome do erro Descrição
100 NÃO_SUPORTADO_NA_PLATAFORMA A API não é compatível com a plataforma atual.
404 FILE_NOT_FOUND O arquivo especificado não foi encontrado no local determinado.
500 INTERNAL_ERROR Erro interno encontrado durante a execução da operação necessária.
1.000 PERMISSION_DENIED A permissão foi negada pelo usuário.
3000 NO_HW_SUPPORT O hardware não dá suporte à funcionalidade.
4000 ARGUMENTOS_INVÁLIDOS Um ou mais argumentos são inválidos.
8000 ABORTAR_USUÁRIO O usuário anula a operação.
9000 ANTIGA_PLATAFORMA O código da plataforma está desatualizado e não implementa essa API.
10000 SIZE_EXCEEDED O valor retornado é muito grande e excedeu os limites de tamanho da plataforma.

Trechos de código

  • Chame captureImage a API para iniciar e capturar imagem usando a câmera:

    microsoftTeams.media.captureImage((error: microsoftTeams.SdkError, attachments: microsoftTeams.media.Media[]) => {
    // If there's any error, an alert shows the error message/code
    if (error) {
      if (error.message) {
        alert(" ErrorCode: " + error.errorCode + error.message);
      } else {
        alert(" ErrorCode: " + error.errorCode);
      }
    } else if (attachments) {
      let y = attachments[0];
      img.src = ("data:" + y.mimeType + ";base64," + y.preview);
    }
    });
    
  • API de chamada selectMedia para capturar e selecionar mídia do dispositivo, câmera ou galeria:

    let imageProp: microsoftTeams.media.ImageProps = {
        sources: [microsoftTeams.media.Source.Camera, microsoftTeams.media.Source.Gallery],
        startMode: microsoftTeams.media.CameraStartMode.Photo,
        ink: false,
        cameraSwitcher: false,
        textSticker: false,
        enableFilter: true,
    };
    let mediaInput: microsoftTeams.media.MediaInputs = {
        mediaType: microsoftTeams.media.MediaType.Image,
        maxMediaCount: 10,
        imageProps: imageProp
    };
    microsoftTeams.media.selectMedia(mediaInput, (error: microsoftTeams.SdkError, attachments: microsoftTeams.media.Media[]) => {
        if (error) {
            if (error.message) {
                alert(" ErrorCode: " + error.errorCode + error.message);
            } else {
                alert(" ErrorCode: " + error.errorCode);
            }
        }
        if (attachments) {
            let y = attachments[0];
            img.src = ("data:" + y.mimeType + ";base64," + y.preview);
        }
    });
    
  • Chame selectMedia a API para capturar vídeos usando a câmera:

    • Capturando vídeos com fullscreen: true:

      fullscreen: true Abre a câmera no modo de gravação de vídeo. Ele fornece uma opção para usar a câmera frontal e traseira e também fornece outros atributos, conforme mencionado no exemplo a seguir:

      
        const defaultLensVideoProps: microsoftTeams.media.VideoProps = {
            sources: [microsoftTeams.media.Source.Camera, microsoftTeams.media.Source.Gallery],
            startMode: microsoftTeams.media.CameraStartMode.Video,
            cameraSwitcher: true,
            maxDuration: 30
       }
        const defaultLensVideoMediaInput: microsoftTeams.media.MediaInputs = {
            mediaType: microsoftTeams.media.MediaType.Video,
            maxMediaCount: 6,
            videoProps: defaultLensVideoProps
       }
      
    • Capturando vídeos com fullscreen: false:

      fullscreen: false Abre a câmera no modo de gravação de vídeo e usa apenas a câmera frontal. Normalmente fullscreen: false é usado quando o usuário deseja gravar vídeo enquanto lê o conteúdo na tela do dispositivo.

      Este modo também suporta isStopButtonVisible: true que adiciona um botão de parada na tela que permite ao usuário parar a gravação. Se isStopButtonVisible: false, a gravação poderá ser interrompida chamando a API mediaController ou quando a duração da gravação atingir maxDuration o tempo especificado.

      Veja a seguir um exemplo para interromper a gravação com maxDuration o tempo especificado:

         const defaultNativeVideoProps: microsoftTeams.media.VideoProps = {
            maxDuration: 30,
            isFullScreenMode: false,
            isStopButtonVisible: false,
            videoController: new microsoftTeams.media.VideoController(videoControllerCallback)
        }
         const defaultNativeVideoMediaInput: microsoftTeams.media.MediaInputs = {
            mediaType: microsoftTeams.media.MediaType.Video,
            maxMediaCount: 1,
            videoProps: defaultNativeVideoProps
        }
      

      Veja a seguir um exemplo para interromper a gravação chamando a API mediaController:

         const defaultNativeVideoProps: microsoftTeams.media.VideoProps = {
            videoController.stop(),
            isFullScreenMode: false,
            isStopButtonVisible: false,
            videoController: new microsoftTeams.media.VideoController(videoControllerCallback)
        }
         const defaultNativeVideoMediaInput: microsoftTeams.media.MediaInputs = {
            mediaType: microsoftTeams.media.MediaType.Video,
            maxMediaCount: 1,
            videoProps: defaultNativeVideoProps
        }
      
  • Chame selectMedia a API para capturar imagens e vídeo usando a câmera:

    Essa API permite que os usuários selecionem entre capturar uma imagem ou um vídeo.

    
      const defaultVideoAndImageProps: microsoftTeams.media.VideoAndImageProps = {
        sources: [microsoftTeams.media.Source.Camera, microsoftTeams.media.Source.Gallery],
        startMode: microsoftTeams.media.CameraStartMode.Photo,
        ink: true,
        cameraSwitcher: true,
        textSticker: true,
        enableFilter: true,
        maxDuration: 30
      }
    
      const defaultVideoAndImageMediaInput: microsoftTeams.media.MediaInputs = {
        mediaType: microsoftTeams.media.MediaType.VideoAndImage,
        maxMediaCount: 6,
        videoAndImageProps: defaultVideoAndImageProps
      }
    
      let videoControllerCallback: microsoftTeams.media.VideoControllerCallback = {
        onRecordingStarted() {
          console.log('onRecordingStarted Callback Invoked');
        },
      };
    
      microsoftTeams.media.selectMedia(defaultVideoAndImageMediaInput, (error: microsoftTeams.SdkError, attachments: microsoftTeams.media.Media[]) => {
        if (error) {
            if (error.message) {
                alert(" ErrorCode: " + error.errorCode + error.message);
            } else {
                alert(" ErrorCode: " + error.errorCode);
            }
        }
    
        var videoElement = document.createElement("video");
        attachments[0].getMedia((error: microsoftTeams.SdkError, blob: Blob) => {
        if (blob) {
            if (blob.type.includes("video")) {
                videoElement.setAttribute("src", URL.createObjectURL(blob));
            }
        }
        if (error) {
            if (error.message) {
                alert(" ErrorCode: " + error.errorCode + error.message);
            } else {
                alert(" ErrorCode: " + error.errorCode);
            }
        }
        });
        });
    
    
  • Chame getMedia a API para recuperar mídia grande em partes:

    let media: microsoftTeams.media.Media = attachments[0]
    media.getMedia((error: microsoftTeams.SdkError, blob: Blob) => {
        if (blob) {
            if (blob.type.includes("image")) {
                img.src = (URL.createObjectURL(blob));
            }
        }
        if (error) {
            if (error.message) {
                alert(" ErrorCode: " + error.errorCode + error.message);
            } else {
                alert(" ErrorCode: " + error.errorCode);
            }
        }
    });
    
  • Chamar viewImages API pela ID, que é retornada pela selectMedia API:

    // View images by id:
    // Assumption: attachmentArray = select Media API Output
    let uriList = [];
    if (attachmentArray && attachmentArray.length > 0) {
        for (let i = 0; i < attachmentArray.length; i++) {
            let file = attachmentArray[i];
            if (file.mimeType.includes("image")) {
                let imageUri = {
                    value: file.content,
                    type: 1,
                }
                uriList.push(imageUri);
            } else {
                alert("File type is not image");
            }
        }
    }
    if (uriList.length > 0) {
        microsoftTeams.media.viewImages(uriList, (error: microsoftTeams.SdkError) => {
            if (error) {
                if (error.message) {
                    output(" ErrorCode: " + error.errorCode + error.message);
                } else {
                    output(" ErrorCode: " + error.errorCode);
                }
            }
        });
    } else {
        output("Url list is empty");
    }
    
  • Chamar viewImages API por URL:

    // View Images by URL:
    // Assumption 2 urls, url1 and url2
    let uriList = [];
    if (URL1 != null && URL1.length > 0) {
        let imageUri = {
            value: URL1,
            type: 2,
        }
        uriList.push(imageUri);
    }
    if (URL2 != null && URL2.length > 0) {
        let imageUri = {
            value: URL2,
            type: 2,
        }
        uriList.push(imageUri);
    }
    if (uriList.length > 0) {
        microsoftTeams.media.viewImages(uriList, (error: microsoftTeams.SdkError) => {
            if (error) {
                if (error.message) {
                    output(" ErrorCode: " + error.errorCode + error.message);
                } else {
                    output(" ErrorCode: " + error.errorCode);
                }
            }
        });
    } else {
        output("Url list is empty");
    }
    
  • Chamada selectMedia e getMedia APIs para gravação de áudio pelo microfone:

      let mediaInput: microsoftTeams.media.MediaInputs = {
        mediaType: microsoftTeams.media.MediaType.Audio,
        maxMediaCount: 1,
        };
        microsoftTeams.media.selectMedia(mediaInput, (error: microsoftTeams.SdkError, attachments: microsoftTeams.media.Media[]) => {
            if (error) {
                if (error.message) {
                    alert(" ErrorCode: " + error.errorCode + error.message);
                } else {
                    alert(" ErrorCode: " + error.errorCode);
                }
            }
        // If you want to directly use the audio file (for smaller file sizes (~4MB))    if (attachments) {
        let audioResult = attachments[0];
        var videoElement = document.createElement("video");
        videoElement.setAttribute("src", ("data:" + audioResult.mimeType + ";base64," + audioResult.preview));
        audioResult.getMedia((error: microsoftTeams.SdkError, blob: Blob) => {
        if (blob) {
            if (blob.type.includes("video")) {
                videoElement.setAttribute("src", URL.createObjectURL(blob));
            }
        }
        if (error) {
            if (error.message) {
                alert(" ErrorCode: " + error.errorCode + error.message);
            } else {
                alert(" ErrorCode: " + error.errorCode);
            }
        }
    });
    });
    

Download de arquivo no Teams móvel

Você pode configurar um aplicativo para permitir que os usuários baixem arquivos do modo de exibição da Web para o dispositivo móvel.

Observação

O download de arquivos só é suportado no cliente móvel do Android Teams e somente arquivos não autenticados podem ser baixados.

Para habilitar, siga estas etapas:

  1. Atualize seu aplicativo do Teams manifest.json arquivo adicionando a devicePermissions propriedade e especificando media , conforme mostrado no manifesto de atualização.

  2. Use o seguinte formato e adicione o atributo de download HTML à página da Web:

    <a href="path_to_file" download="download">Download</a>
    

Confira também