Compartilhando várias imagens ou arquivos com o Whatsapp ou outro app.

11/02/2021

Durante o desenvolvimento do aplicativo https://play.google.com/store/apps/details?id=com.imperium.JusImperium, esbarrei na necessidade de compartilhar várias imagens de uma só vez com os aplicativos de mensagens (Whatsapp, Messenger ou com o FaceBook), depois de muito pesquisar, a solução que encontrei foi apelar para os Intents do Android. Uma fonte de informação que me ajudou muito foi o blog do MVP Landerson Gomes.

O primeiro passo para se compartilhar as imagens é pedir a permissão READ/WRITE_EXTERNAL_STORAGE e gravar as imagens em uma pasta compartilhada. Costumo usar System.IOUtils.TPath.GetSharedDocumentsPath. Utilizando esse caminho não há necessidade de utilizar o FileProvider para se obter acesso às imagens. No caso do fonte abaixo, eu já possuo 3 bitmaps armazenados em Image1, Image2 e Image3. Faço a gravação das imagens com os nomes 1.png, 2.png e 3.png.

Após as imagens gravadas, crio um JArrayList para carregar as URIs de todas as imagens, crio o Intent definindo a ação para ACTION_SEND.

Para que o intent abra diretamente o WhatsApp, o Package é definido para “com.whastapp’. Caso queira que o usuário escolha para qual aplicativo as imagens devem ser enviadas, retire o SetPackage do código, ou substitua de acordo com sua necessidade.

Pode-se junto com as imagens enviar um texto, para isso basta definir o type para text/plain e incluir um EXTRA_TEXT com o texto desejado. O próximo passo é criar os URIs, definir seu tipo e inclui-los no array. Agora basta incluir o array como EXTRA_STREAM através do método putParcelableArrayListExtra, setar o flag de READ_URI_PERMISSION e enviar o Intent.

procedure TForm1.Button1Click(Sender: TObject);
Var
   Intent : JIntent;
   Uri    : Jnet_Uri;
   Uris   : JArrayList;
   Path   : String;
begin
Path := System.IOUtils.TPath.GetSharedDocumentsPath+PathDelim;
Image1.Bitmap.SaveToFile(Path+'1.png');
Image2.Bitmap.SaveToFile(Path+'2.png');
Image3.Bitmap.SaveToFile(Path+'3.png');
Uris   := TJArrayList.Create;
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
Intent.setPackage(StringToJString('com.whatsapp'));
Intent.setType(StringToJString('text/palin'));
Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Texto.Text));

Uri := TJNet_Uri.JavaClass.parse(StringToJString(Path+'1.png')); 
Uris.add(Uri); 
Intent.setDataAndType(Uri, StringToJString('image/png'));

Uri := TJNet_Uri.JavaClass.parse(StringToJString(Path+'2.png')); 
Uris.add(Uri); 
Intent.setDataAndType(Uri, StringToJString('image/png'));

Uri := TJNet_Uri.JavaClass.parse(StringToJString(Path+'3.png')); 
Uris.add(Uri); 
Intent.setDataAndType(Uri, StringToJString('image/png'));

Intent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, Uris);
Intent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
TAndroidHelper.Activity.startActivity(Intent);
end;

O WhatsApp será aberto com sua lista de contatos, basta escolher para qual contato quer enviar.

Uma fonte de informação muito valiosa é o tutorial escrito pelo Landerson Gomes sobre o uso dos intents com o Delphi.

Até a próxima!

Deixe um comentário