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 essa capacidade.
Projetado para compartilhar
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;
- disponibilizar 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. Sharesheets e como usá-las.
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 usando um
OnReceiveContentListener. Essa API fornece um único local para
código para processar o recebimento de todo o conteúdo, desde texto simples e estilizado até marcação.
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
As intents só podem conter uma pequena quantidade de dados. Por isso, o Android oferece uma maneira de elas conterem um identificador seguro para arquivos. Compartilhamento seguro de arquivos de mídia por seu app envolve:
- Configure seu app para oferecer um identificador seguro para o arquivo na forma de um
URI de conteúdo: usando o componente
FileProviderdo Android. - Especifique diretórios compartilháveis no manifesto.
- Use
getUriForFilepara criar um URL de conteúdo que funcione como um identificador seguro 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.
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.
- Compactação de imagens: use formatos modernos de compactação de imagens, como WebP e AVIF, que oferecem taxas de compactação superiores em comparação com JPEGs tradicionais sem perda significativa de qualidade. Teste diferentes tipos de qualidade configurações para encontrar o ponto ideal.
- Compressão de vídeo: aproveite o poder do vídeo AV1 ou H.265 (HEVC)
de compressão para fornecer melhor eficiência de compressão, mantendo
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")
Adaptação de mídia
As plataformas de mídia social geralmente aplicam 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.
Forneça instruções e orientações claras sobre como os usuários podem otimizar a mídia 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 aumentar a capacidade de descoberta de mídia
Adicionar metadados relevantes, como títulos, descrições e tags aos arquivos de mídia, pode melhorar a visibilidade deles. Incentivar os usuários a adicionar seus próprios dados com descrições e legendas, o que personaliza 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()