Comment récupérer le chemin (path) d'une image ou d'une vidéo sur WhatsApp ?

La célèbre application de messagerie Whatsapp est utilisée partout dans le monde pour communiquer. Elle est disponible sur l'ensemble des plateformes mobiles populaires, dont Android. Si vous développez une application qui va interagir avec Whatsapp, vous recevrez les contenus sous forme d'URI utilisant le protocole "content://", par exemple "content://com.whatsapp.provider.media/item/12345". Vous pouvez les manipuler avec un objet fourni par le SDK d'Android. Pour obtenir le chemin d'une image, il faut effectuer des manipulations supplémentaires.

La classe "InputStream" est utilisée pour manipuler un flux d'entrée. En indiquant en paramètre l'URI, on peut ainsi obtenir dans cet objet le média que l'on vient de récupérer.

InputStream inputStream = getContentResolver().openInputStream("content://com.whatsapp.provider.media/item/12345");

Pour obtenir le chemin absolu d'une image reçue dans Whatsapp, il convient d'utiliser les fonctionnalités du système d'exploitation Android. Il faut d'abord transformer l'URI en image. La classe "BitmapFactory" fournit la méthode "decodeStream" pour convertir le stream en image.

Bitmap roughBitmap = null;
roughBitmap = BitmapFactory.decodeStream(inputStream);

Il faut ensuite obtenir les dimensions de l'image. On utilise pour cela la classe "Matrix". On peut ainsi calculer la taille exacte de l'image.

Matrix matrice = new Matrix();
RectF inRect = new RectF(0, 0, roughBitmap.Width, roughBitmap.Height);
RectF outRect = new RectF(0, 0, dstWidth, dstHeight);
matrice.SetRectToRect(inRect, outRect, Matrix.ScaleToFit.Center);
float[] tabValeur = new float[9];
m.GetValues(tabValeur);

Si nécessaire, on redimensionne ensuite l'image.

Bitmap resizedBitmap = Bitmap.CreateScaledBitmap(roughBitmap, (int) (roughBitmap.Width * tabValeur[0]), (int) (roughBitmap.Height * tabValeur[4]), true);

La dernière étape consiste à utiliser les classes de gestion de fichiers pour récupérer le chemin vers la nouvelle image. Choisissez d'abord un nom pour votre image. Ici nous prenons le moment en cours pour être sûr que l'image n'existe pas déjà.

string nomImage = "IMG_" + new Java.Text.SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date()) + ".png";

La ligne de code suivante va retourner le chemin absolu vers le répertoire de sauvegarde des images.

var repertoireImages = Environment.GetExternalStoragePublicDirectory("DCIM").AbsolutePath;

Il ne reste plus qu'à sauvegarder l'image et à récupérer le chemin vers celle-ci.

Java.IO.File image = new Java.IO.File(repertoireImage);
if (!image.Exists())
{
  image.Mkdir();
}
var cheminImage = System.IO.Path.Combine(repertoireImages, nomImage);

La variable "cheminImage" contient alors le chemin vers l'image dans le système.