SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
Como Impulsionar o App Android -
Compartilhamento Nativo
thiengo.com.br
Compartilhamento via API nativa
Quando falamos de compartilhamento é comum pensar em redes sociais, mas na
verdade até mesmo o envio de dados de uma atividade a outra, no mesmo
aplicativo, é uma forma de compartilhamento de conteúdo.
Felizmente o Android tem as intenções, ou Intents, que nos permitem a fácil
comunicação entre atividades / aplicativos sem, principalmente, a dependência de
APIs específicas para permitir, por exemplo, o compartilhamento de algum dado.
Com as Intents é possível compartilhar conteúdos simples, como textos, até
conteúdos complexos que envolvem também binários (imagem, vídeo, áudio,
arquivos, …).
É importante ressaltar que o compartilhamento de conteúdo depende também do
aplicativo que receberá os dados em compartilhamento, pois de acordo com a
configuração do app receptor não é possível que este seja uma opção de share.
Neste conjunto de slides nosso foco é no compartilhamento utilizando Intents em
um aplicativo emissor, em futuros conteúdos trabalharemos também como fazer
com que um aplicativo Android possa ser um receptor de conteúdos compartilhados
via Intent.
Conteúdo simples, não binário
Compartilhar conteúdo somente em texto é bem simples. Veja o código a seguir:
Nos conteúdos que temos no Blog sobre Intent e IntentFilter há explicações
detalhadas da importância de cada propriedade dessas classes.
Mas adianto a ti que não há com que se preocupar se você ainda não conhece a
fundo as entidades Intent e IntentFilter, isso, pois as configurações de
compartilhamento são simples e com rótulos autocomentados.
O código anterior é válido também para compartilhamento de links, domínios
públicos.
As propriedades action e type são importantes para que aplicativos receptores
possam ou não aparecer como opções de compartilhamento.
Executando o projeto com o código anterior, temos:
Verificação de segurança
É prudente colocarmos uma verificação de segurança antes da invocação de
startActivity():
Esta verificação é recomendada principalmente para compartilhamentos onde
somente aplicativos específicos são aceitos, apps definidos na propriedade
package de Intent. Em slides posteriores abordaremos a propriedade package.
Caixa de diálogo para a escolha de aplicativo
A Chooser Dialog aparecerá somente quando mais de um aplicativo no aparelho do
usuário for um possível alvo do conteúdo que está para ser compartilhado:
Em casos onde somente um aplicativo é passível para compartilhamento do
conteúdo, esse app será aberto diretamente.
É possível customizarmos a Chooser Dialog, colocando um título personalizado.
Veja o código a seguir:
O uso de createChooser() é válido para qualquer tipo de conteúdo em Intent de
compartilhamento, não somente conteúdo em texto.
Executando o projeto com o código anterior, temos:
Conteúdo HTML
Compartilhar conteúdo HTML é tão simples quanto o compartilhamento de
conteúdo em texto. Veja o código a seguir:
Executando o projeto de teste com o código anterior, temos:
Email
Uma das técnicas que mais utilizo em aplicativos simples que também permitem o contato com
clientes é o uso de intenções para o fácil envio de email à empresa do aplicativo. A configuração
segura para envio de email é a seguinte:
Não deixe de ler os comentários do código anterior para entender o porquê de cada
configuração para aplicativos de email.
Executando o projeto com o código do slide anterior, temos:
Como no emulador de testes somente havia um aplicativo que respondia às
configurações de email que colocamos em Intent, mais precisamente o aplicativo
Gmail, então o acionamento do botão "COMPARTILHAR POR EMAIL" fez com que
este aplicativo abrisse direto, sem uma Chooser Dialog.
No projeto de exemplo do artigo deste conjunto de slides teremos um algoritmo
para o compartilhamento de conteúdo binário e em texto via email.
Conteúdo binário (imagem, vídeo, áudio, ...)
interno ao app
Agora se inicia as seções de slides que provavelmente você estava aguardando,
sobre compartilhamento de conteúdos binários. Aqui utilizaremos como exemplo
binários de imagens.
A seguir o código de compartilhamento de um binário que está dentro do aplicativo,
mais precisamente dentro do folder drawable:
Executando o projeto com o código anterior, temos:
Depois, salvando o binário:
É importante lembrar da autoridade que aplicativos receptores têm em relação ao conteúdo
compartilhado com eles. Mesmo quando esses aparecem como apps passíveis de
compartilhamento é possível de acontecer a não aceitação de alguns conteúdos em Intent.
Veja a seguir o resultado da tentativa de compartilhamento, utilizando o código anterior, no
app do Gmail:
Por algum motivo o aplicativo do Gmail não consegue anexar binários que estão
dentro do aplicativo emissor, mesmo se o app do Gmail estiver com a permissão de
acesso a conteúdo em armazenamento externo.
Temos de entender que essa é uma limitação do aplicativo do Gmail para binários
internos ao aplicativo. Certamente deve ter algum algoritmo que permite esse
contorno, ou seja, a compartilhamento de binário interno com o app do Gmail, mas
deveria ser algo trivial como foi no caso do Google Drive app.
Note que não há a necessidade de nosso aplicativo ter acesso a permissão de
armazenamento externo para compartilhar um binário interno a ele, mas o
aplicativo receptor tem de ter essa permissão e é ele que tem de solicitar essa
permissão quando no momento do compartilhamento, algo que não ocorre com o
aplicativo do Gmail, mas é realizado com maestria pelo app do Google Drive.
Conteúdo binário do armazenamento externo
Para o compartilhamento de conteúdo binário externo ao aplicativo, são necessárias ainda mais
configurações extras.
A primeira é a criação de um arquivo de configuração de FileProvider, arquivo que nos permitirá
definir a área do armazenamento externo ao aplicativo que poderemos acessar para obter conteúdos
binários.
É recomendado que este arquivo de configuração esteja em /res/xml e tenha um nome
autocomentado sobre a função dele, aqui o nome será file_path.xml:
É possível ter inúmeros "caminhos" (diretórios) como elementos de <paths>. Não é
possível colocar como valor do atributo path a definição de um arquivo em
específico, somente diretório.
Para conhecer as outras possíveis tags filhas de <paths>, acesse a documentação
oficial em: Specifying Available Files.
Antes de colocarmos o código de configuração do FileProvider no
AndroidManifest.xml é preciso saber o que é um FileProvider. Segundo a
documentação:
FileProvider é uma subclasse especial de ContentProvider que facilita o
compartilhamento seguro de arquivos associados a um aplicativo, mesmo
arquivos externos a ele, criando uma Uri content:// para um arquivo ao invés
vez de uma Uri file:/// que tem mais limitações em compartilhamento.
Resumidamente: um objeto FileProvider vai nos permitir o compartilhamento
seguro de qualquer arquivo presente nos paths definidos em <paths> sem que o
app receptor do compartilhamento tenha as permissões de leitura e escrita no
armazenamento externo, isso, pois essas permissões são concedidas
temporariamente devido à Uri gerada ser uma Uri ContentProvider.
Certo, já temos o arquivo de configuração de área de acesso do FileProvider, mas e a
definição do FileProvider?
Está vem no arquivo AndroidManifest.xml como um filho direto da tag <application>:
Antes de partirmos para o código com a Intent de compartilhamento de binário
externo ao app, ainda é preciso colocarmos o algoritmo de solicitação de
permissão em tempo de execução.
Primeiro as permissões necessárias, em AndroidManifest.xml:
Agora a vinculação da biblioteca EasyPermissions ao projeto de teste, está será
utilizada na administração do algoritmo de solicitação de permissão em tempo de
execução. A seguir a adição da API no Gradle Nível de Aplicativo, build.gradle
(Module: app):
Então o código de solicitação de permissão na classe que conterá o algoritmo de
compartilhamento de binário via Intent:
O método askPermissionToShareBinaryContent() é o que primeiro deve ser
invocado antes do acesso ao algoritmo de compartilhamento.
Para saber mais sobre as vantagens de uso da API EasyPermissions e ainda mais
possibilidades com ela, não deixe de acessar meu novo livro Desenvolvedor Kotlin
Android - Bibliotecas para o dia a dia onde o primeiro capítulo tem 55 páginas
dedicadas somente a está API e a um exemplo de aplicativo utilizando ela.
Com isso somente temos de colocar em onPermissionsGranted() o algoritmo de
compartilhamento de binário via Intent:
Executando o projeto com o código anterior, temos:
Seção grande, não? Mas é assim que deve ser feito quando compartilhando
conteúdo binário presente no aparelho, mas não no aplicativo.
Apesar na expressiva quantidade de código, a maior parte dele é boilerplate,
exigindo pouca lógica de negócio.
Conteúdo binário remoto
Também é possível compartilhar conteúdos carregados de servidores remotos.
Assuma que o código a seguir é responsável por carregar uma imagem no
ImageView do layout da atividade principal do app de testes:
A API Picasso é uma das melhores em termos de eficiência e eficácia para
carregamento de imagens em aplicativos Android. A adição dela ao projeto é por
meio do Gradle Nível de Aplicativo, build.gradle (Module: app):
Em meu novo livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia o
segundo capítulo é inteiramente dedicado a essa API, 87 páginas, mostrando ainda
mais funcionalidades possíveis com a Picasso Android.
Depois que a imagem já foi carregada na View alvo é possível acessa-la como um
Bitmap, mais precisamente como um BitmapDrawable que é um subtipo de
Bitmap:
Com um Bitmap em "mãos" o que precisamos é de um algoritmo que consiga
retornar uma Uri partindo do Bitmap, algoritmo como o a seguir:
Apesar de contentProvider também está sendo utilizado, para compartilhamento
de conteúdo remoto não é necessária a configuração de um FileProvider, como
fizemos na seção anterior. Mas aqui também são exigidas as permissões de
acesso ao armazenamento externo.
Vou abreviar o algoritmo e assim não mostrarei o código de solicitação de
permissão em tempo de execução, este você pode obter na seção anterior com a
API EasyPermissions.
Assuma que as permissões de armazenamento já foram concedidas. Assim temos o
código final para compartilhamento de um binário de uma fonte remota ao aparelho:
Executando o projeto de testes com o algoritmo anterior, temos:
O aplicativo que vai receber o binário em compartilhamento não precisa de
permissão de armazenamento, somente o app emissor da Intent.
Curiosidade: um nome aleatório é utilizado como rótulo do binário em
compartilhamento.
Vários conteúdos binários
As regras de compartilhamento de vários conteúdos binários são as mesmas já discutidas em
seções anteriores, ou seja, o algoritmo utilizado para cada conteúdo em compartilhamento
depende da origem dele.
No código a seguir, para manter a simplicidade, vamos ao compartilhamento de dois conteúdos
binários internos ao aplicativo, algo que dispensa a necessidade de qualquer código de
solicitação de permissão em tempo de execução:
Note o tipo da ação, Intent.ACTION_SEND_MULTIPLE, e como as Uris têm de ser
fornecidas em um ArrayList.
Executando o projeto de testes com o algoritmo anterior, temos:
Diferentes tipos de dados
É possível compartilhar diferentes tipos de dados em um só Intent. O aplicativo
receptor é que deverá tratar corretamente cada tipo em compartilhamento.
Caso haja também binários no compartilhamento, todas as regras de negócio
discutidas em seções anteriores deverão ser levadas em conta de acordo com a
origem de cada binário.
No código do próximo slide estaremos compartilhando, junto com um texto, um
binário remoto, logo, assuma que as permissões de armazenamento foram
concedidas e que o método getImageUri() é o mesmo utilizado na seção de slides
"Conteúdo binário remoto”.
Segue:
Executando o projeto de teste com o algoritmo anterior, temos:
Conteúdos para aplicativos específicos
Caso seu aplicativo possa compartilhar determinados conteúdos somente com algum outro app,
é possível restringir esse "algum outro app" colocando o nome de pacote dele no Intent de
compartilhamento, isso utilizando o método setPackage().
No código a seguir somente o Gmail pode receber o conteúdo compartilhado:
O bloco condicional para verificação de presença de aplicativo compatível com o conteúdo em
compartilhamento é muito importante quando um package é fornecido, pois é possível que o
aplicativo não esteja instalado no aparelho.
Executando o projeto com o algoritmo anterior, temos:
Caso você precise definir mais de um aplicativo para possível compartilhamento,
faça como no código a seguir:
Executando o projeto com o código anterior, temos:
Por que o conteúdo limitado sobre aplicativos
sociais?
Na verdade tudo que foi apresentado até aqui é passível de ser utilizado em
qualquer aplicativo social, porém alguns apps de redes sociais apresentam
limitações.
O aplicativo do Facebook, por exemplo, tem problemas com conteúdos em
compartilhamento que contém binários e não binários. Como solução o Facebook
tem uma API nativa somente para compartilhamento via aplicativos Android.
Na seção anterior, onde utilizamos como exemplo pacotes de aplicativos populares,
tem o modelo de algoritmo que permite também o compartilhamento somente com
apps sociais, caso seja necessária essa restrição.
De qualquer forma, havendo a possibilidade de compartilhamento de binários,
busque primeiro pela API nativa do app alvo como receptor do compartilhamento.
Pontos negativos
• O compartilhamento de conteúdo binário no armazenamento local não é
nada trivial, exigindo o entendimento de entidades, FilePovider, que
provavelmente não voltaremos a utilizar;
• Mesmo que a configuração de compartilhamento via Intent esteja bem
construída, ainda dependemos da qualidade do algoritmo do aplicativo
receptor.
Pontos positivos
• Comparando o código de compartilhamento via APIs nativas com o código de
APIs de terceiros, o de APIs nativas é ainda a melhor opção devido à
simplicidade quando não há, por exemplo, um binário, no armazenamento
local, a ser compartilhado;
• A fácil possiblidade de definirmos os aplicativos que podem receber o
conteúdo em compartilhamento faz com que muito código extra de API
específica seja evitado no projeto.
Conclusão
Provavelmente você é um daqueles desenvolvedores Android que quer ver o seu
aplicativo sendo utilizado pela massa de usuários.
Um dos algoritmos que podem ajudar isso acontecer, a adoção da massa, é o
algoritmo de compartilhamento.
Adicionar o compartilhamento via APIs nativas é, até o momento, a melhor opção,
além de não exigir a adição de referências extras que inflariam ainda mais o
tamanho final do aplicativo.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• Como Impulsionar o App Android - Compartilhamento Nativo.
Fontes:
• Sending simple data to other apps;
• Sharing Content with Intents;
• FileProvider;
• Send Email Intent - Resposta de thanhbinh84 e Community♦;
• Get the URI of an image stored in drawable - Resposta de Michael;
• How to get the Uri of a image stored on the SDCARD? - Resposta de SeyedPooya Soofbaf;
• How to share text to WhatsApp from my app? - Resposta de Sonny Ng e vault;
• How to share text to WhatsApp from my app? - Resposta de Jitendra Kumar. Balla e Paolo Forgia;
• Get Bitmap from ImageView in Android L - Resposta de Pankaj Arora e Bipin Bharti;
• How to get a Uri object from Bitmap - Resposta de Ajay e blueware;
• How to filter specific apps for ACTION_SEND intent (and set a different text for each app) -
Resposta de dacoinminster e Pragati Singh.
Para estudo
• Treinamento oficial:
• Prototipagem Profissional de Aplicativos Android.
• Meus livros:
• Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia;
• Receitas Para Desenvolvedores Android;
• Refatorando Para Programas Limpos.
• Redes:
• Udemy;
• YouTube;
• Facebook;
• LinkedIn;
• GitHub;
• Twitter;
• Google Plus.
• Blog App.
Como Impulsionar o App Android -
Compartilhamento Nativo
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Mais conteúdo relacionado

Semelhante a Como compartilhar conteúdo do app Android com Intents

Curso de Android - aula 3
Curso de Android - aula 3Curso de Android - aula 3
Curso de Android - aula 3Jose Berardo
 
Introdução a programação para plataforma iOS
Introdução a programação para plataforma iOSIntrodução a programação para plataforma iOS
Introdução a programação para plataforma iOSDevmedia
 
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...GUTS-RS
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma AndroidÉdipo Souza
 
Aula01 - introdução, Activity
Aula01 - introdução,  ActivityAula01 - introdução,  Activity
Aula01 - introdução, ActivityArthur Emanuel
 
Desenvolvimento android
Desenvolvimento androidDesenvolvimento android
Desenvolvimento androidDiego Keller
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no AndroidVinícius Thiengo
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogVinícius Thiengo
 
Internet I - Aula 05 - Primeiro App FireFox OS!
Internet I - Aula 05 - Primeiro App FireFox OS!Internet I - Aula 05 - Primeiro App FireFox OS!
Internet I - Aula 05 - Primeiro App FireFox OS!Manoel Afonso
 
Parse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaParse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaRudson Lima
 
Ajuste de Texto com Autosizing TextView - Android Jetpack
Ajuste de Texto com Autosizing TextView - Android JetpackAjuste de Texto com Autosizing TextView - Android Jetpack
Ajuste de Texto com Autosizing TextView - Android JetpackVinícius Thiengo
 
APIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoAPIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoFábio Rosato
 

Semelhante a Como compartilhar conteúdo do app Android com Intents (20)

App Inventor
App InventorApp Inventor
App Inventor
 
App inventor
App inventorApp inventor
App inventor
 
Curso de Android - aula 3
Curso de Android - aula 3Curso de Android - aula 3
Curso de Android - aula 3
 
Introdução a programação para plataforma iOS
Introdução a programação para plataforma iOSIntrodução a programação para plataforma iOS
Introdução a programação para plataforma iOS
 
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...
[GUTS-RS] Workshop (prático) de Testes Automatizados para dispositivos móveis...
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Curso Básico Android - Aula 05
Curso Básico Android - Aula 05Curso Básico Android - Aula 05
Curso Básico Android - Aula 05
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma Android
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Desmistificando o DialogFlow
Desmistificando o DialogFlowDesmistificando o DialogFlow
Desmistificando o DialogFlow
 
Android - Notas de aula
Android - Notas de aulaAndroid - Notas de aula
Android - Notas de aula
 
Aula01 - introdução, Activity
Aula01 - introdução,  ActivityAula01 - introdução,  Activity
Aula01 - introdução, Activity
 
Desenvolvimento android
Desenvolvimento androidDesenvolvimento android
Desenvolvimento android
 
Lottie API Para Animações no Android
Lottie API Para Animações no AndroidLottie API Para Animações no Android
Lottie API Para Animações no Android
 
Estudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do BlogEstudando Android - Lista de Conteúdos do Blog
Estudando Android - Lista de Conteúdos do Blog
 
Internet I - Aula 05 - Primeiro App FireFox OS!
Internet I - Aula 05 - Primeiro App FireFox OS!Internet I - Aula 05 - Primeiro App FireFox OS!
Internet I - Aula 05 - Primeiro App FireFox OS!
 
Parse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da forçaParse Push Notification - O Lado negro da força
Parse Push Notification - O Lado negro da força
 
Apostilaandroidfatecnormal
ApostilaandroidfatecnormalApostilaandroidfatecnormal
Apostilaandroidfatecnormal
 
Ajuste de Texto com Autosizing TextView - Android Jetpack
Ajuste de Texto com Autosizing TextView - Android JetpackAjuste de Texto com Autosizing TextView - Android Jetpack
Ajuste de Texto com Autosizing TextView - Android Jetpack
 
APIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construçãoAPIs gerenciadas de ponta a ponta - construção
APIs gerenciadas de ponta a ponta - construção
 

Mais de Vinícius Thiengo

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Vinícius Thiengo
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria LerVinícius Thiengo
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidVinícius Thiengo
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria lerVinícius Thiengo
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidVinícius Thiengo
 
Como Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidComo Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidVinícius Thiengo
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioVinícius Thiengo
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidVinícius Thiengo
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomVinícius Thiengo
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidVinícius Thiengo
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidVinícius Thiengo
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingVinícius Thiengo
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIVinícius Thiengo
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarVinícius Thiengo
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarVinícius Thiengo
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalVinícius Thiengo
 
ViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaVinícius Thiengo
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidVinícius Thiengo
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoVinícius Thiengo
 

Mais de Vinícius Thiengo (20)

Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?Android: Qual Tecnologia de Desenvolvimento Utilizar?
Android: Qual Tecnologia de Desenvolvimento Utilizar?
 
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
7 Livros Que Não São de TI, Mas Que Um Programador Deveria Ler
 
Annotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no AndroidAnnotation Span Para Estilização de Texto no Android
Annotation Span Para Estilização de Texto no Android
 
5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler5 livros que não são de TI, mas que um desenvolvedor deveria ler
5 livros que não são de TI, mas que um desenvolvedor deveria ler
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
Como Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no AndroidComo Utilizar Métodos Binding Adapter no Android
Como Utilizar Métodos Binding Adapter no Android
 
Live Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android StudioLive Templates Para Otimização de Tempo no Android Studio
Live Templates Para Otimização de Tempo no Android Studio
 
Observable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI AndroidObservable Binding Para Atualização na UI Android
Observable Binding Para Atualização na UI Android
 
PhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de ZoomPhotoView Android Para a Completa Implementação de Zoom
PhotoView Android Para a Completa Implementação de Zoom
 
True Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no AndroidTrue Time API Para Data e Horário NTP no Android
True Time API Para Data e Horário NTP no Android
 
Utilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no AndroidUtilizando Intenções Para Mapas de Alta Qualidade no Android
Utilizando Intenções Para Mapas de Alta Qualidade no Android
 
Leitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXingLeitor de Códigos no Android com Barcode Scanner API - ZXing
Leitor de Códigos no Android com Barcode Scanner API - ZXing
 
Como Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State APIComo Reter Objetos Utilizando Android-State API
Como Reter Objetos Utilizando Android-State API
 
Chips Android, Quando e Como Utilizar
Chips Android, Quando e Como UtilizarChips Android, Quando e Como Utilizar
Chips Android, Quando e Como Utilizar
 
BottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando UtilizarBottomNavigationView Android, Como e Quando Utilizar
BottomNavigationView Android, Como e Quando Utilizar
 
Android: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda CulturalAndroid: Avaliação do Pré-projeto Agenda Cultural
Android: Avaliação do Pré-projeto Agenda Cultural
 
ViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de ArquiteturaViewModel Android, Como Utilizar Este Componente de Arquitetura
ViewModel Android, Como Utilizar Este Componente de Arquitetura
 
Freelancer Android
Freelancer AndroidFreelancer Android
Freelancer Android
 
Definindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos AndroidDefinindo Fontes em Aplicativos Android
Definindo Fontes em Aplicativos Android
 
Fontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e UsoFontes em XML, Android O. Configuração e Uso
Fontes em XML, Android O. Configuração e Uso
 

Último

A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.silves15
 
Universidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumUniversidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumPatrícia de Sá Freire, PhD. Eng.
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditaduraAdryan Luiz
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxkarinedarozabatista
 
02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdfJorge Andrade
 
Recurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasRecurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasCasa Ciências
 
Governo Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 BrasilGoverno Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 Brasillucasp132400
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADOcarolinacespedes23
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesMary Alvarenga
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VER
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VERELETIVA TEXTOS MULTIMODAIS LINGUAGEM VER
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VERDeiciane Chaves
 
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Mary Alvarenga
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSilvana Silva
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasRosalina Simão Nunes
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxLuizHenriquedeAlmeid6
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasCassio Meira Jr.
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfManuais Formação
 

Último (20)

A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.A horta do Senhor Lobo que protege a sua horta.
A horta do Senhor Lobo que protege a sua horta.
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 
Universidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comumUniversidade Empreendedora como uma Plataforma para o Bem comum
Universidade Empreendedora como uma Plataforma para o Bem comum
 
trabalho wanda rocha ditadura
trabalho wanda rocha ditaduratrabalho wanda rocha ditadura
trabalho wanda rocha ditadura
 
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptxAD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
AD2 DIDÁTICA.KARINEROZA.SHAYANNE.BINC.ROBERTA.pptx
 
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -XI OLIMPÍADAS DA LÍNGUA PORTUGUESA      -
XI OLIMPÍADAS DA LÍNGUA PORTUGUESA -
 
Bullying, sai pra lá
Bullying,  sai pra láBullying,  sai pra lá
Bullying, sai pra lá
 
02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf02. Informática - Windows 10 apostila completa.pdf
02. Informática - Windows 10 apostila completa.pdf
 
Recurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de PartículasRecurso Casa das Ciências: Sistemas de Partículas
Recurso Casa das Ciências: Sistemas de Partículas
 
Governo Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 BrasilGoverno Provisório Era Vargas 1930-1934 Brasil
Governo Provisório Era Vargas 1930-1934 Brasil
 
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
activIDADES CUENTO  lobo esta  CUENTO CUARTO GRADOactivIDADES CUENTO  lobo esta  CUENTO CUARTO GRADO
activIDADES CUENTO lobo esta CUENTO CUARTO GRADO
 
A Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das MãesA Arte de Escrever Poemas - Dia das Mães
A Arte de Escrever Poemas - Dia das Mães
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VER
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VERELETIVA TEXTOS MULTIMODAIS LINGUAGEM VER
ELETIVA TEXTOS MULTIMODAIS LINGUAGEM VER
 
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
Grupo Tribalhista - Música Velha Infância (cruzadinha e caça palavras)
 
Slides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptxSlides 1 - O gênero textual entrevista.pptx
Slides 1 - O gênero textual entrevista.pptx
 
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicasCenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
Cenários de Aprendizagem - Estratégia para implementação de práticas pedagógicas
 
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptxSlides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
Slides Lição 4, Betel, Ordenança quanto à contribuição financeira, 2Tr24.pptx
 
Habilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e EspecíficasHabilidades Motoras Básicas e Específicas
Habilidades Motoras Básicas e Específicas
 
UFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdfUFCD_10392_Intervenção em populações de risco_índice .pdf
UFCD_10392_Intervenção em populações de risco_índice .pdf
 

Como compartilhar conteúdo do app Android com Intents

  • 1. Como Impulsionar o App Android - Compartilhamento Nativo thiengo.com.br
  • 2. Compartilhamento via API nativa Quando falamos de compartilhamento é comum pensar em redes sociais, mas na verdade até mesmo o envio de dados de uma atividade a outra, no mesmo aplicativo, é uma forma de compartilhamento de conteúdo. Felizmente o Android tem as intenções, ou Intents, que nos permitem a fácil comunicação entre atividades / aplicativos sem, principalmente, a dependência de APIs específicas para permitir, por exemplo, o compartilhamento de algum dado. Com as Intents é possível compartilhar conteúdos simples, como textos, até conteúdos complexos que envolvem também binários (imagem, vídeo, áudio, arquivos, …). É importante ressaltar que o compartilhamento de conteúdo depende também do aplicativo que receberá os dados em compartilhamento, pois de acordo com a configuração do app receptor não é possível que este seja uma opção de share. Neste conjunto de slides nosso foco é no compartilhamento utilizando Intents em um aplicativo emissor, em futuros conteúdos trabalharemos também como fazer com que um aplicativo Android possa ser um receptor de conteúdos compartilhados via Intent.
  • 3. Conteúdo simples, não binário Compartilhar conteúdo somente em texto é bem simples. Veja o código a seguir: Nos conteúdos que temos no Blog sobre Intent e IntentFilter há explicações detalhadas da importância de cada propriedade dessas classes. Mas adianto a ti que não há com que se preocupar se você ainda não conhece a fundo as entidades Intent e IntentFilter, isso, pois as configurações de compartilhamento são simples e com rótulos autocomentados. O código anterior é válido também para compartilhamento de links, domínios públicos. As propriedades action e type são importantes para que aplicativos receptores possam ou não aparecer como opções de compartilhamento.
  • 4. Executando o projeto com o código anterior, temos:
  • 5. Verificação de segurança É prudente colocarmos uma verificação de segurança antes da invocação de startActivity(): Esta verificação é recomendada principalmente para compartilhamentos onde somente aplicativos específicos são aceitos, apps definidos na propriedade package de Intent. Em slides posteriores abordaremos a propriedade package.
  • 6. Caixa de diálogo para a escolha de aplicativo A Chooser Dialog aparecerá somente quando mais de um aplicativo no aparelho do usuário for um possível alvo do conteúdo que está para ser compartilhado:
  • 7. Em casos onde somente um aplicativo é passível para compartilhamento do conteúdo, esse app será aberto diretamente. É possível customizarmos a Chooser Dialog, colocando um título personalizado. Veja o código a seguir: O uso de createChooser() é válido para qualquer tipo de conteúdo em Intent de compartilhamento, não somente conteúdo em texto.
  • 8. Executando o projeto com o código anterior, temos:
  • 9. Conteúdo HTML Compartilhar conteúdo HTML é tão simples quanto o compartilhamento de conteúdo em texto. Veja o código a seguir:
  • 10. Executando o projeto de teste com o código anterior, temos:
  • 11. Email Uma das técnicas que mais utilizo em aplicativos simples que também permitem o contato com clientes é o uso de intenções para o fácil envio de email à empresa do aplicativo. A configuração segura para envio de email é a seguinte:
  • 12. Não deixe de ler os comentários do código anterior para entender o porquê de cada configuração para aplicativos de email. Executando o projeto com o código do slide anterior, temos:
  • 13. Como no emulador de testes somente havia um aplicativo que respondia às configurações de email que colocamos em Intent, mais precisamente o aplicativo Gmail, então o acionamento do botão "COMPARTILHAR POR EMAIL" fez com que este aplicativo abrisse direto, sem uma Chooser Dialog. No projeto de exemplo do artigo deste conjunto de slides teremos um algoritmo para o compartilhamento de conteúdo binário e em texto via email.
  • 14. Conteúdo binário (imagem, vídeo, áudio, ...) interno ao app Agora se inicia as seções de slides que provavelmente você estava aguardando, sobre compartilhamento de conteúdos binários. Aqui utilizaremos como exemplo binários de imagens. A seguir o código de compartilhamento de um binário que está dentro do aplicativo, mais precisamente dentro do folder drawable:
  • 15.
  • 16. Executando o projeto com o código anterior, temos:
  • 17. Depois, salvando o binário:
  • 18. É importante lembrar da autoridade que aplicativos receptores têm em relação ao conteúdo compartilhado com eles. Mesmo quando esses aparecem como apps passíveis de compartilhamento é possível de acontecer a não aceitação de alguns conteúdos em Intent. Veja a seguir o resultado da tentativa de compartilhamento, utilizando o código anterior, no app do Gmail:
  • 19. Por algum motivo o aplicativo do Gmail não consegue anexar binários que estão dentro do aplicativo emissor, mesmo se o app do Gmail estiver com a permissão de acesso a conteúdo em armazenamento externo. Temos de entender que essa é uma limitação do aplicativo do Gmail para binários internos ao aplicativo. Certamente deve ter algum algoritmo que permite esse contorno, ou seja, a compartilhamento de binário interno com o app do Gmail, mas deveria ser algo trivial como foi no caso do Google Drive app. Note que não há a necessidade de nosso aplicativo ter acesso a permissão de armazenamento externo para compartilhar um binário interno a ele, mas o aplicativo receptor tem de ter essa permissão e é ele que tem de solicitar essa permissão quando no momento do compartilhamento, algo que não ocorre com o aplicativo do Gmail, mas é realizado com maestria pelo app do Google Drive.
  • 20. Conteúdo binário do armazenamento externo Para o compartilhamento de conteúdo binário externo ao aplicativo, são necessárias ainda mais configurações extras. A primeira é a criação de um arquivo de configuração de FileProvider, arquivo que nos permitirá definir a área do armazenamento externo ao aplicativo que poderemos acessar para obter conteúdos binários. É recomendado que este arquivo de configuração esteja em /res/xml e tenha um nome autocomentado sobre a função dele, aqui o nome será file_path.xml:
  • 21. É possível ter inúmeros "caminhos" (diretórios) como elementos de <paths>. Não é possível colocar como valor do atributo path a definição de um arquivo em específico, somente diretório. Para conhecer as outras possíveis tags filhas de <paths>, acesse a documentação oficial em: Specifying Available Files. Antes de colocarmos o código de configuração do FileProvider no AndroidManifest.xml é preciso saber o que é um FileProvider. Segundo a documentação: FileProvider é uma subclasse especial de ContentProvider que facilita o compartilhamento seguro de arquivos associados a um aplicativo, mesmo arquivos externos a ele, criando uma Uri content:// para um arquivo ao invés vez de uma Uri file:/// que tem mais limitações em compartilhamento. Resumidamente: um objeto FileProvider vai nos permitir o compartilhamento seguro de qualquer arquivo presente nos paths definidos em <paths> sem que o app receptor do compartilhamento tenha as permissões de leitura e escrita no armazenamento externo, isso, pois essas permissões são concedidas temporariamente devido à Uri gerada ser uma Uri ContentProvider.
  • 22. Certo, já temos o arquivo de configuração de área de acesso do FileProvider, mas e a definição do FileProvider? Está vem no arquivo AndroidManifest.xml como um filho direto da tag <application>:
  • 23. Antes de partirmos para o código com a Intent de compartilhamento de binário externo ao app, ainda é preciso colocarmos o algoritmo de solicitação de permissão em tempo de execução. Primeiro as permissões necessárias, em AndroidManifest.xml: Agora a vinculação da biblioteca EasyPermissions ao projeto de teste, está será utilizada na administração do algoritmo de solicitação de permissão em tempo de execução. A seguir a adição da API no Gradle Nível de Aplicativo, build.gradle (Module: app): Então o código de solicitação de permissão na classe que conterá o algoritmo de compartilhamento de binário via Intent:
  • 24.
  • 25. O método askPermissionToShareBinaryContent() é o que primeiro deve ser invocado antes do acesso ao algoritmo de compartilhamento. Para saber mais sobre as vantagens de uso da API EasyPermissions e ainda mais possibilidades com ela, não deixe de acessar meu novo livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia onde o primeiro capítulo tem 55 páginas dedicadas somente a está API e a um exemplo de aplicativo utilizando ela. Com isso somente temos de colocar em onPermissionsGranted() o algoritmo de compartilhamento de binário via Intent:
  • 26.
  • 27. Executando o projeto com o código anterior, temos:
  • 28. Seção grande, não? Mas é assim que deve ser feito quando compartilhando conteúdo binário presente no aparelho, mas não no aplicativo. Apesar na expressiva quantidade de código, a maior parte dele é boilerplate, exigindo pouca lógica de negócio.
  • 29. Conteúdo binário remoto Também é possível compartilhar conteúdos carregados de servidores remotos. Assuma que o código a seguir é responsável por carregar uma imagem no ImageView do layout da atividade principal do app de testes:
  • 30. A API Picasso é uma das melhores em termos de eficiência e eficácia para carregamento de imagens em aplicativos Android. A adição dela ao projeto é por meio do Gradle Nível de Aplicativo, build.gradle (Module: app): Em meu novo livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia o segundo capítulo é inteiramente dedicado a essa API, 87 páginas, mostrando ainda mais funcionalidades possíveis com a Picasso Android. Depois que a imagem já foi carregada na View alvo é possível acessa-la como um Bitmap, mais precisamente como um BitmapDrawable que é um subtipo de Bitmap:
  • 31. Com um Bitmap em "mãos" o que precisamos é de um algoritmo que consiga retornar uma Uri partindo do Bitmap, algoritmo como o a seguir: Apesar de contentProvider também está sendo utilizado, para compartilhamento de conteúdo remoto não é necessária a configuração de um FileProvider, como fizemos na seção anterior. Mas aqui também são exigidas as permissões de acesso ao armazenamento externo. Vou abreviar o algoritmo e assim não mostrarei o código de solicitação de permissão em tempo de execução, este você pode obter na seção anterior com a API EasyPermissions.
  • 32. Assuma que as permissões de armazenamento já foram concedidas. Assim temos o código final para compartilhamento de um binário de uma fonte remota ao aparelho:
  • 33. Executando o projeto de testes com o algoritmo anterior, temos: O aplicativo que vai receber o binário em compartilhamento não precisa de permissão de armazenamento, somente o app emissor da Intent. Curiosidade: um nome aleatório é utilizado como rótulo do binário em compartilhamento.
  • 34. Vários conteúdos binários As regras de compartilhamento de vários conteúdos binários são as mesmas já discutidas em seções anteriores, ou seja, o algoritmo utilizado para cada conteúdo em compartilhamento depende da origem dele. No código a seguir, para manter a simplicidade, vamos ao compartilhamento de dois conteúdos binários internos ao aplicativo, algo que dispensa a necessidade de qualquer código de solicitação de permissão em tempo de execução: Note o tipo da ação, Intent.ACTION_SEND_MULTIPLE, e como as Uris têm de ser fornecidas em um ArrayList.
  • 35. Executando o projeto de testes com o algoritmo anterior, temos:
  • 36. Diferentes tipos de dados É possível compartilhar diferentes tipos de dados em um só Intent. O aplicativo receptor é que deverá tratar corretamente cada tipo em compartilhamento. Caso haja também binários no compartilhamento, todas as regras de negócio discutidas em seções anteriores deverão ser levadas em conta de acordo com a origem de cada binário. No código do próximo slide estaremos compartilhando, junto com um texto, um binário remoto, logo, assuma que as permissões de armazenamento foram concedidas e que o método getImageUri() é o mesmo utilizado na seção de slides "Conteúdo binário remoto”.
  • 38. Executando o projeto de teste com o algoritmo anterior, temos:
  • 39. Conteúdos para aplicativos específicos Caso seu aplicativo possa compartilhar determinados conteúdos somente com algum outro app, é possível restringir esse "algum outro app" colocando o nome de pacote dele no Intent de compartilhamento, isso utilizando o método setPackage(). No código a seguir somente o Gmail pode receber o conteúdo compartilhado: O bloco condicional para verificação de presença de aplicativo compatível com o conteúdo em compartilhamento é muito importante quando um package é fornecido, pois é possível que o aplicativo não esteja instalado no aparelho.
  • 40. Executando o projeto com o algoritmo anterior, temos:
  • 41. Caso você precise definir mais de um aplicativo para possível compartilhamento, faça como no código a seguir:
  • 42. Executando o projeto com o código anterior, temos:
  • 43. Por que o conteúdo limitado sobre aplicativos sociais? Na verdade tudo que foi apresentado até aqui é passível de ser utilizado em qualquer aplicativo social, porém alguns apps de redes sociais apresentam limitações. O aplicativo do Facebook, por exemplo, tem problemas com conteúdos em compartilhamento que contém binários e não binários. Como solução o Facebook tem uma API nativa somente para compartilhamento via aplicativos Android. Na seção anterior, onde utilizamos como exemplo pacotes de aplicativos populares, tem o modelo de algoritmo que permite também o compartilhamento somente com apps sociais, caso seja necessária essa restrição. De qualquer forma, havendo a possibilidade de compartilhamento de binários, busque primeiro pela API nativa do app alvo como receptor do compartilhamento.
  • 44. Pontos negativos • O compartilhamento de conteúdo binário no armazenamento local não é nada trivial, exigindo o entendimento de entidades, FilePovider, que provavelmente não voltaremos a utilizar; • Mesmo que a configuração de compartilhamento via Intent esteja bem construída, ainda dependemos da qualidade do algoritmo do aplicativo receptor.
  • 45. Pontos positivos • Comparando o código de compartilhamento via APIs nativas com o código de APIs de terceiros, o de APIs nativas é ainda a melhor opção devido à simplicidade quando não há, por exemplo, um binário, no armazenamento local, a ser compartilhado; • A fácil possiblidade de definirmos os aplicativos que podem receber o conteúdo em compartilhamento faz com que muito código extra de API específica seja evitado no projeto.
  • 46. Conclusão Provavelmente você é um daqueles desenvolvedores Android que quer ver o seu aplicativo sendo utilizado pela massa de usuários. Um dos algoritmos que podem ajudar isso acontecer, a adoção da massa, é o algoritmo de compartilhamento. Adicionar o compartilhamento via APIs nativas é, até o momento, a melhor opção, além de não exigir a adição de referências extras que inflariam ainda mais o tamanho final do aplicativo.
  • 47. Fontes Conteúdo completo, em texto e em vídeo, no link a seguir: • Como Impulsionar o App Android - Compartilhamento Nativo. Fontes: • Sending simple data to other apps; • Sharing Content with Intents; • FileProvider; • Send Email Intent - Resposta de thanhbinh84 e Community♦; • Get the URI of an image stored in drawable - Resposta de Michael; • How to get the Uri of a image stored on the SDCARD? - Resposta de SeyedPooya Soofbaf; • How to share text to WhatsApp from my app? - Resposta de Sonny Ng e vault; • How to share text to WhatsApp from my app? - Resposta de Jitendra Kumar. Balla e Paolo Forgia; • Get Bitmap from ImageView in Android L - Resposta de Pankaj Arora e Bipin Bharti; • How to get a Uri object from Bitmap - Resposta de Ajay e blueware; • How to filter specific apps for ACTION_SEND intent (and set a different text for each app) - Resposta de dacoinminster e Pragati Singh.
  • 48. Para estudo • Treinamento oficial: • Prototipagem Profissional de Aplicativos Android. • Meus livros: • Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia; • Receitas Para Desenvolvedores Android; • Refatorando Para Programas Limpos. • Redes: • Udemy; • YouTube; • Facebook; • LinkedIn; • GitHub; • Twitter; • Google Plus. • Blog App.
  • 49. Como Impulsionar o App Android - Compartilhamento Nativo thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com