Introduction : pourquoi appeler une Activity depuis une autre application ?
\n\nImaginez que vous créez une application de notes et souhaitez permettre à l'utilisateur de prendre une photo directement depuis votre interface. Ou encore, votre messagerie doit ouvrir les contacts du répertoire. Dans les deux cas, vous devez lancer une Activity depuis une autre application Android.
\n\nCette tâche est l'une des questions les plus populaires sur Stack Overflow (des milliers de vues et des centaines de votes). Et pour cause : si elle est mal réalisée, l'application peut planter avec une ActivityNotFoundException ou, pire encore, créer un risque de sécurité. Dans ce tutoriel, nous allons détailler toutes les subtilités en langage Kotlin, afin que vous puissiez intégrer en toute confiance des écrans externes dans vos projets.
D'ailleurs, vous êtes sur le site PythonLib, où nous parlons souvent de Python, mais aujourd'hui c'est un cas particulier. Le développement Android en Kotlin est une compétence puissante qui se marie parfaitement avec un backend en Python. C'est parti !
\n\nQu'est-ce qu'un Intent et pourquoi est-ce la clé de la solution ?
\n\nDans Android, un Intent est un message qui dit au système : « Hé, je dois faire quelque chose avec telle action ». Pour lancer une Activity depuis une autre application, deux approches sont utilisées :
\n\n- \n
- Intent explicite — vous savez exactement quel composant vous voulez lancer (par exemple,
com.example.target.MainActivity). Fonctionne uniquement si vous avez accès au code de cette application. \n - Intent implicite — vous décrivez ce que vous voulez faire (par exemple, « ouvrir une carte avec des coordonnées »), et le système trouve lui-même l'application appropriée. C'est une méthode plus flexible et plus sûre pour appeler une Activity externe. \n
Nous nous concentrerons sur les Intent implicites, car ils sont les plus souvent utilisés pour l'interaction inter-processus Android.
\n\nExemple de base : ouvrir une carte avec des coordonnées
\n\nCommençons par un exemple simple qui montre comment lancer une Activity depuis une autre application pour afficher une carte.
\n\n// Kotlin\nval gmmIntentUri = Uri.parse("geo:55.7558,37.6173?z=15")\nval mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)\nmapIntent.setPackage("com.google.android.apps.maps")\n\n// Vérifions s'il existe une application capable de traiter l'Intent\nif (mapIntent.resolveActivity(packageManager) != null) {\n startActivity(mapIntent)\n} else {\n // Affichons un message d'erreur à l'utilisateur\n Toast.makeText(this, "Google Maps n'est pas installé", Toast.LENGTH_SHORT).show()\n}\n\nQue se passe-t-il ici ? Nous créons un Intent avec l'action ACTION_VIEW et un URI contenant les coordonnées. Ensuite, avec setPackage, nous indiquons explicitement que nous voulons utiliser Google Maps (bien que ce soit facultatif — le système peut proposer un choix). Le plus important est la vérification via resolveActivity. Cela évite un crash si l'application nécessaire n'est pas présente sur l'appareil.
Scénario : appeler l'appareil photo et obtenir un résultat
\n\nPassons maintenant à un cas plus complexe — lancer une Activity depuis une autre application en attendant un résultat. Exemple classique : prendre une photo et la récupérer dans votre application.
\n\n// Kotlin\nprivate const val REQUEST_IMAGE_CAPTURE = 1\n\nprivate fun dispatchTakePictureIntent() {\n val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\n // Vérifions que l'appareil photo est disponible\n if (takePictureIntent.resolveActivity(packageManager) != null) {\n startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)\n } else {\n // Gestion de l'erreur : appareil photo non trouvé\n }\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n super.onActivityResult(requestCode, resultCode, data)\n if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {\n val imageBitmap = data?