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:
- descobrir quando seus usuários concluem um compartilhamento e para onde;
- Oferecer visualizações de conteúdo rich text a partir do Android 10 (nível 29 da API)
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:
- Configure seu app para oferecer um identificador seguro para o arquivo na forma de um
URI de conteúdo: usando o componente
FileProvider
do Android. - Especifique diretórios compartilháveis no manifesto.
- Use
getUriForFile
para criar um URL de conteúdo que funcione como um endereço seguro alça para o arquivo. - Crie uma intent que conceda permissões ao arquivo.
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()