Como os aplicativos Android implementam o botão de compartilhamento?

11

Fiquei me perguntando como aplicativos Android e Android implementa o botão de compartilhamento e o mecanismo de compartilhamento. Por exemplo, quando eu clico no botão de compartilhamento no YouTube, aparece uma lista dos aplicativos a serem compartilhados. Como esta lista é determinada? Existe uma intenção específica de "compartilhamento" e todos os pontos capazes de compartilhar o tipo de intenção fornecido nos extras de intenção são exibidos? Qual é o nome técnico do padrão de design usado para implementar isso? Obrigado.

Jack Maddington
fonte
1
Você realmente quis dizer "cocô", ou isso é um erro de digitação para "pops"? Pelo menos no inglês americano, o primeiro é o que os bebês fazem com as fraldas.
JDługosz
Você está certo. Recentemente, mudei para o teclado Swype no Android, o que me permite digitar mais rápido, mas ocasionalmente ele digita a palavra errada e não percebo. Ainda não sei o que fazer sobre isso, não sou uma pessoa muito cuidadosa. Às vezes, no sub e nem consegue ver a tela corretamente.
Jack Maddington
No sub (submarino?)! O que fazer: revisar antes de enviar. E não polua sua lista de previsões com palavras embaraçosas.
JDługosz
Por coincidência, minha lista de previsões é preenchida com material de e-mails antigos, que o Swype lê automaticamente. Caramba!
precisa saber é o seguinte

Respostas:

10

Existem duas partes: o mecanismo para os aplicativos de comunicação dizerem que podem compartilhar coisas e o mecanismo para os aplicativos com conteúdo para compartilhar. Vou lidar com eles um de cada vez, mas primeiro uma rápida observação sobre as intenções .

Intenções

A intenção no Android é o que é usado para iniciar um aplicativo. Pode funcionar como um atalho ou como uma associação de arquivos do Windows. A intenção pode especificar o nome do aplicativo a ser iniciado, mas não precisa. Também pode especificar a ação a ser executada (por exemplo, "abra sua atividade principal", "visualize este URL", "crie uma entrada na agenda") e o tipo MIME do objeto em que ele atuará (por exemplo, a coisa que você deseja visualizar tem o tipo image / jpeg). Alguns nomes de ações são específicos para um aplicativo específico, mas muitos são padronizados pelo Android para permitir que os aplicativos interajam.

Filtros de intenção e aplicativo de comunicação

Cada aplicativo especifica filtros de intenção para dizer que tipo de ações ele pode executar. por exemplo, um aplicativo visualizador de imagens registraria um filtro de intenção para "visualizar este URL" onde o tipo MIME é "image / *"; um navegador da web registraria um filtro de intenção para "visualizar este URL", onde o esquema de URL é "http" ou "https". Para poder compartilhar coisas, um aplicativo registra um filtro de intenção para a intenção "enviar", com um tipo específico (por exemplo, se ele pode compartilhar fotos apenas) ou para qualquer tipo.

Aplicativo de conteúdo

O aplicativo que deseja compartilhar algum conteúdo cria uma intenção com a ação "compartilhar" e um URL apontando para o conteúdo a ser compartilhado. (Geralmente, é um URL "temporário" que fornece ao aplicativo receptor acesso temporário ao arquivo no armazenamento privado do aplicativo de conteúdo ou a um fluxo gerado pelo aplicativo de conteúdo.) Ele não especifica o nome de um aplicativo para lidar com o intenção. Em seguida, fornece essa intenção à estrutura do Android e solicita que o Android exiba a caixa de diálogo do seletor . O Android compara a intenção com os filtros de intenção de todos os aplicativos instalados, cria a lista e a mostra ao usuário. Quando o usuário escolhe um aplicativo específico, o Android inicia o aplicativo e passa a intenção. O aplicativo usa o URL para obter o conteúdo do aplicativo original.

Novo no Marshmallow: compartilhamento direto

No Marshmallow, há outro mecanismo chamado Direct Share . Isso complementa o mecanismo de intenção para que você possa escolher pessoas ou grupos para compartilhar diretamente na caixa de diálogo do seletor, ignorando a etapa extra de "para quem você gostaria de enviá-lo". Isso funciona um pouco diferente: o aplicativo de comunicação deve fornecer um serviço. Quando o aplicativo com o conteúdo solicita um seletor, o Android inicia o serviço para cada aplicativo relevante. O serviço retorna uma lista de destinos de compartilhamento relevantes , e o Android reúne todas essas listas separadas na lista exibida na caixa de diálogo.

Dan Hulme
fonte
Mas vi aplicativos mostrarem várias caixas de diálogo de seleção diferentes . Todos eles são realmente exibidos pelo sistema operacional ou o próprio aplicativo pode obter uma lista de destinos?
precisa saber é o seguinte
@rawrawity A caixa de diálogo interna possui algumas opções de personalização (por exemplo, para definir o título), mas também é possível que o aplicativo solicite ao Android a lista de destinos de compartilhamento e os coloque em sua própria caixa de diálogo. Meu navegador selecionador bURLy é um exemplo disso, mas com a intenção "URL aberta" em vez da intenção "enviar".
Dan Hulme
11

Não sou desenvolvedor, por isso só posso dar uma explicação bruta: os aplicativos declaram em Manifestquais Mimetipos eles entendem e estão dispostos a responder em ações compartilhadas. Para isso, eles definem os chamados "filtros de intenção", por exemplo:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="message/*" />
    <data android:mimeType="multipart/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Portanto, sempre que você pressiona o botão "compartilhar", o conteúdo a ser compartilhado é avaliado e comparado com os aplicativos que declararam estar dispostos a receber o formato.

Fontes:

Izzy
fonte
1
É praticamente isso diretamente. O aplicativo (fazendo o compartilhamento) por si próprio pode filtrar alguns dos respondentes com intenção, mas a maioria não.
coteyr
2
@HiltonShumway, foi por isso que eu votei na resposta dele. Além de mim, Dan está em desenvolvimento e sabe muito melhor como as coisas estão juntas. Então, quando eu postei a minha resposta, eu estava esperando que ele ia postar um bem - ele não desapontou minha esperança :)
Izzy