Sobre o compartilhamento de mídia

Seja uma imagem engraçada, um vídeo informativo ou um clipe de áudio cativante, permitir que os usuários compartilhem conteúdo enriquece a experiência deles e promove o engajamento. Este documento explora os fundamentos do compartilhamento de mídia no Android, incluindo as APIs e técnicas necessárias para integrar esse recurso.

Criado para compartilhamento

O design do Android promove a interoperabilidade entre apps usando um sistema baseado em Intents. Uma intent é uma descrição abstrata de uma operação a ser realizada. As intents permitem que apps se comuniquem entre si sem precisar saber especificidades uns dos outros.

Quando um app quer compartilhar dados ou iniciar uma ação, ele cria uma intent que especifica o tipo de conteúdo e operação. O sistema Android apresenta uma lista de apps relevantes que podem processar essa intent, permitindo que o usuário escolha qual app usar. Essa abordagem promove um ecossistema colaborativo.

O compartilhamento de texto envolve apenas algumas linhas de código:

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to share.")
    type = "text/plain"
}

val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)

A linha createChooser mostra a interface do Android Sharesheet, que permite que os usuários compartilhem informações com outras pessoas, incluindo sugestões de apps relevantes, com um único toque. Outras coisas que você pode fazer com o Android Sharesheet incluem:

Consulte Enviar dados simples para outros apps para mais informações sobre o Android Sharesheet e como usá-lo.

Forneça destinos de compartilhamento direto para facilitar e agilizar o compartilhamento de URLs, imagens ou outros tipos de dados com seu app. O compartilhamento direto funciona apresentando contatos de apps de mensagens e redes sociais diretamente no Sharesheet do Android, sem que os usuários precisem selecionar o app e procurar o contato.

Ofereça suporte ao recebimento de conteúdo avançado por meio de uma OnReceiveContentListener. Essa API oferece um único local para que o código processe o recebimento de todo o conteúdo, desde textos simples e estilizados até marcações, imagens, vídeos, arquivos de áudio e outros. O conteúdo pode vir de imagens do teclado, arrastar e soltar ou para a área de transferência.

Compartilhar arquivos de mídia

Intents só podem conter uma pequena quantidade de dados, então o Android oferece uma maneira de Intents para conter um identificador seguro para arquivos. O compartilhamento seguro de arquivos de mídia do app envolve:

Consulte Sobre o compartilhamento seguro de arquivos para mais informações. .

Otimizar mídias para compartilhamento

Não importa se você compartilha mídia com outros usuários no app ou com outro app, compartilhe mídia de alta qualidade e compartilhar sua experiência.

Encontrar o equilíbrio entre qualidade e tamanho

Arquivos de mídia grandes podem consumir rapidamente a largura de banda e o armazenamento, causando atrasos frustrantes e possíveis cobranças de dados excedentes para os usuários. A compressão é sua melhor amiga aqui.

  • Compactação de imagem: use formatos modernos de compactação de imagem, como WebP e AVIF, que oferecem taxas de compactação superiores em comparação com as tradicionais JPEGs sem perda significativa de qualidade. Teste diferentes tipos de qualidade configurações para encontrar o ponto ideal.
  • Compressão de vídeo: aproveite a potência da compressão de vídeo AV1 ou H.265 (HEVC) para oferecer uma melhor eficiência de compressão, mantendo uma excelente qualidade visual. Você pode verificar a presença de codificação de hardware em dispositivos com Android 10 ou versões mais recentes, bem como no mediaPerformanceClass, para ajudar determinar o que seu dispositivo suporta melhor. Considere oferecer diferentes opções de resolução para atender a diferentes preferências do usuário e condições de rede.
fun hasHardwareEncodingSupportFor(mimeType: String): Boolean {
    val codecList = MediaCodecList(REGULAR_CODECS)
    val codecInfos = codecList.codecInfos
    for ( codecInfo in codecInfos ) {
        if (!codecInfo.isEncoder()) {
            continue;
        }
        if (!codecInfo.isHardwareAccelerated()) {
            continue;
        }
        val types: Array<String> = codecInfo.getSupportedTypes()
        for (j in types.indices) {
            if (types[j].equals(mimeType, ignoreCase = true)) {
                return true
            }
        }
    }
    return false
}
// test for AV1 hardware encoding support
val hasAV1 = hasHardwareEncodingSupportFor("video/av01")

Adaptar mídia

As plataformas de mídias sociais costumam impor dimensões e proporções específicas para mídias compartilhadas. Redimensionando e recortando proativamente os arquivos de mídia antes de compartilhamento, você pode evitar problemas inesperados de distorção ou formatação ao os usuários postam nas plataformas favoritas deles.

Fornecer instruções e orientações claras sobre como os usuários podem otimizar suas mídias antes de compartilhar. Isso inclui dicas sobre como ajustar as taxas de bits de codificação, definir parâmetros de quantização, escolher o formato do vídeo, selecionar tamanhos de arquivo apropriados ou compreender o impacto de diferentes as opções de compartilhamento.

Como melhorar a capacidade de descoberta de mídia

Adicionar metadados relevantes, como títulos, descrições e tags à sua mídia podem melhorar a capacidade de descoberta deles. Incentive os usuários a adicionar as próprias descrições e legendas ao compartilhar, personalizando ainda mais a experiência.

Adicionar metadados a imagens

A classe Jetpack ExifInterface grava metadados em JPEG, PNG e WebP imagens na forma de tags Exif.

// sets the title of the image in the form of Exif data
val exif = ExifInterface(imageFile)
exif.setAttribute(ExifInterface.TAG_IMAGE_DESCRIPTION, "Beautiful sunset")
exif.saveAttributes()