Recevoir des données simples depuis d'autres applications

Tout comme une application peut envoyer des données à d'autres applications, elle peut également en recevoir d'autres. Réfléchissez à la manière dont les utilisateurs interagissent avec votre application et aux types de données que vous souhaitez recevoir d'autres applications. Par exemple, une application de réseau social peut souhaiter recevoir du contenu textuel, tel qu'une URL Web intéressante, à partir d'une autre application.

Les utilisateurs d'autres applications envoient fréquemment des données à votre application via Android Sharesheet ou le résolveur d'intent. Les applications qui envoient des données à votre application doivent définir un type MIME pour ces données. Votre application peut recevoir les données envoyées par une autre application comme suit:

  • Une Activity avec une balise intent-filter correspondante dans le fichier manifeste
  • Raccourcis de partage publiés par votre application.

Les cibles de partage direct sont des liens profonds vers une activité spécifique dans votre application. Elles représentent souvent une personne ou un groupe, et la Sharesheet d'Android les montre. Par exemple, une application de messagerie peut fournir à une personne une cible de partage direct qui renvoie directement vers une conversation avec elle via des liens profonds. Pour obtenir des instructions détaillées, consultez la page Fournir des cibles de partage direct.

Compatibilité avec les types MIME

Idéalement, une application doit pouvoir recevoir la plage la plus large possible de types MIME. Par exemple, une application de chat conçue pour envoyer du texte, des images et des vidéos est idéalement compatible avec text/*, image/* et video/*. Voici quelques types MIME courants pour envoyer et recevoir des données simples dans Android.

Les destinataires s'enregistrent pour Envoi par les expéditeurs
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Extensions de fichier compatibles application/pdf

Consultez le registre officiel des types de médias MIME de l'IANA.

Définissez des objectifs de partage efficaces

Lorsqu'un utilisateur appuie sur une cible de partage associée à une activité spécifique, il doit pouvoir confirmer et modifier le contenu partagé avant de l'utiliser. Cela est particulièrement important pour les données textuelles.

Recevoir des données avec une activité

La réception de données avec une activité implique la mise à jour du fichier manifeste, la gestion du contenu entrant et la vérification que l'utilisateur reconnaît votre application.

Mettre à jour votre fichier manifeste

Les filtres d'intent indiquent au système les intents acceptés par un composant d'application. De la même manière que vous avez créé un intent avec une action ACTION_SEND dans la leçon Envoyer des données simples à d'autres applications, vous allez créer des filtres d'intent pour recevoir des intents avec cette action. Vous définissez un filtre d'intent dans votre fichier manifeste à l'aide de l'élément <intent-filter>. Par exemple, si votre application gère la réception de contenu textuel, un fichier manifeste comprenant une ou plusieurs images de n'importe quel type se présentera comme suit:

<activity android:name=".ui.MyActivity" >
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

Lorsqu'une autre application tente de partager l'un de ces éléments en créant un intent et en le transmettant à startActivity(), votre application est répertoriée en tant qu'option dans Android Sharesheet ou le résolveur d'intent. Si l'utilisateur sélectionne votre application, l'activité correspondante est lancée (.ui.MyActivity dans l'exemple précédent). Il vous appartient ensuite de gérer le contenu de manière appropriée dans votre code et votre interface utilisateur.

Gérer le contenu entrant

Pour gérer le contenu diffusé par un Intent, appelez getIntent() afin d'obtenir l'objet Intent. Une fois que vous disposez de l'objet, vous pouvez examiner son contenu pour déterminer la marche à suivre. Si cette activité peut être lancée à partir d'autres parties du système (comme le lanceur d'applications), tenez-en compte lors de l'examen de l'intent.

Prenez garde à la vérification des données entrantes, vous ne savez jamais ce qu'une autre application peut vous envoyer. Par exemple, le type MIME défini peut être incorrect ou l'image envoyée peut être extrêmement volumineuse. Veillez également à traiter les données binaires dans un thread distinct plutôt que dans le thread principal ("UI").

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    when {
        intent?.action == Intent.ACTION_SEND -> {
            if ("text/plain" == intent.type) {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }
        intent?.action == Intent.ACTION_SEND_MULTIPLE
                && intent.type?.startsWith("image/") == true -> {
                handleSendMultipleImages(intent) // Handle multiple images being sent
        }
        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
    ...
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI to reflect text being shared
    }
}

private fun handleSendImage(intent: Intent) {
    (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
        // Update UI to reflect image being shared
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let {
        // Update UI to reflect multiple images being shared
    }
}

Java

void onCreate (Bundle savedInstanceState) {
    ...
    // Get intent, action and MIME type
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        } else if (type.startsWith("image/")) {
            handleSendImage(intent); // Handle single image being sent
        }
    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
        if (type.startsWith("image/")) {
            handleSendMultipleImages(intent); // Handle multiple images being sent
        }
    } else {
        // Handle other intents, such as being started from the home screen
    }
    ...
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        // Update UI to reflect text being shared
    }
}

void handleSendImage(Intent intent) {
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        // Update UI to reflect image being shared
    }
}

void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        // Update UI to reflect multiple images being shared
    }
}

La mise à jour de l'UI après la réception des données peut être aussi simple que de remplir un EditText ou plus complexe, comme appliquer un filtre photo intéressant à une image. C'est à votre application de ce qu'il se passe ensuite.

Assurez-vous que les utilisateurs reconnaissent votre application

Votre application est représentée par son icône et son libellé dans la Sharesheet et le résolveur d'intent d'Android. Ces deux éléments sont définis dans le fichier manifeste. Vous pouvez définir des libellés de filtre d'activité ou d'intent pour fournir plus de contexte.

À partir d'Android 10 (niveau d'API 29), Android Sharesheet n'utilise que les icônes définies dans le fichier manifeste sur votre balise application. Android ignore les icônes définies sur les balises intent-filter et activity.