Une application peut enregistrer la vidéo ou l'audio en cours de lecture dans une autre application. Ces
applications doivent gérer correctement le
MediaProjection jeton. Cette page explique comment procéder. Elle explique également comment un administrateur d'appareil peut désactiver la possibilité d'enregistrer des captures d'écran et comment une application audio peut empêcher d'autres applications d'enregistrer le contenu qu'elle lit.
Gérer un jeton MediaProjection
L'API MediaProjection
permet aux applications d'acquérir un jeton MediaProjection qui leur donne un accès unique
pour capturer le contenu de l'écran ou l'audio. L'OS Android demande l'autorisation de l'utilisateur avant d'accorder le jeton à votre application.
Le système d'exploitation affiche les jetons MediaProjection actifs dans l'interface utilisateur des Réglages rapides et permet aux utilisateurs de retirer l'accès à un jeton à tout moment. Dans ce cas, les écrans virtuels ou les flux audio associés à la session cessent de recevoir des flux multimédias. Votre application doit répondre de manière appropriée. Sinon, elle continuera à enregistrer le silence audio ou un flux vidéo noir.
Pour gérer la perte d'un jeton, enregistrez un rappel sur l'MediaProjection
instance à l'aide de la
registerCallback
méthode, et arrêtez l'enregistrement lorsque la
onStop
méthode est appelée.
Pour en savoir plus, consultez Projection multimédia.
Enregistrer une vidéo
Consultez l'application exemple ScreenCapture pour découvrir comment utiliser l'API Media Projection afin de capturer l'écran d'un appareil en temps réel et de l'afficher sur une SurfaceView.
Vous pouvez utiliser DevicePolicyManager
pour empêcher l'enregistrement de l'écran. Pour les comptes d'entreprise (Android for Work), l'
administrateur peut désactiver la collecte de données de l'assistant pour le profil professionnel
à l'aide de la
méthode setScreenCaptureDisabled.
L'atelier de programmation Gérer les appareils Android sans application explique comment interdire les captures d'écran.
Capturer la lecture audio
L'API AudioPlaybackCapture a été introduite dans Android 10. Elle permet aux applications de copier l'audio en cours de lecture par d'autres applications. Cette fonctionnalité est l'équivalent de la capture d'écran, mais pour l'audio. Le principal cas d'utilisation concerne les applications de streaming qui souhaitent capturer l'audio en cours de lecture par les jeux.
Notez que l'API AudioPlaybackCapture n'affecte pas la latence de l'application dont l'audio est capturé.
Créer une application de capture
Pour des raisons de sécurité et de confidentialité, la capture de la lecture impose certaines limites. Pour pouvoir capturer l'audio, une application doit répondre aux exigences suivantes :
- L'application doit disposer de l'
RECORD_AUDIOautorisation. - L'application doit afficher l'invite affichée par
MediaProjectionManager.createScreenCaptureIntent(), et l'utilisateur doit l'approuver. - Les applications de capture et de lecture doivent se trouver dans le même profil utilisateur.
Pour capturer l'audio d'une autre application, votre application doit créer un
AudioRecord objet
et y ajouter une
AudioPlaybackCaptureConfiguration. Procédez comme suit :
- Appelez
AudioPlaybackCaptureConfiguration.Builder.build()pour créer uneAudioPlaybackCaptureConfiguration. - Transmettez la configuration à
AudioRecorden appelantsetAudioPlaybackCaptureConfig.
Contrôler la capture audio
Votre application peut contrôler les types de contenu qu'elle peut enregistrer et les autres types d'applications qui peuvent enregistrer leur propre lecture.
Limiter la capture par contenu audio
Une application peut limiter l'audio qu'elle peut capturer à l'aide des méthodes suivantes :
- Transmettez un
AUDIO_USAGEà AudioPlaybackCaptureConfiguration.addMatchingUsage() pour autoriser la capture d'une utilisation spécifique. Appelez la méthode plusieurs fois pour spécifier plusieurs utilisations. - Transmettez un
AUDIO_USAGEà AudioPlaybackCaptureConfiguration.excludeUsage() pour interdire la capture de cette utilisation. Appelez la méthode plusieurs fois pour spécifier plusieurs utilisations. - Transmettez un UID à AudioPlaybackCaptureConfiguration.addMatchingUid() pour ne capturer que les applications avec un UID spécifique. Appelez la méthode plusieurs fois pour spécifier plusieurs UID.
- Transmettez un UID à AudioPlaybackCaptureConfiguration.excludeUid() pour interdire la capture de cet UID. Appelez la méthode plusieurs fois pour spécifier plusieurs UID.
Notez que vous ne pouvez pas utiliser les méthodes addMatchingUsage() et excludeUsage() ensemble. Vous devez choisir l'une ou l'autre. De même, vous ne pouvez pas utiliser addMatchingUid() et excludeUid() en même temps.
Limiter la capture par d'autres applications
Vous pouvez configurer une application pour empêcher d'autres applications de capturer son audio. L'audio provenant d'une application ne peut être capturé que si l'application répond aux exigences suivantes :
Utilisation
Le lecteur qui produit l'audio doit définir son utilisation
sur USAGE_MEDIA,
USAGE_GAME ou
USAGE_UNKNOWN.
Règle de capture
La règle de capture du lecteur doit être
AudioAttributes.ALLOW_CAPTURE_BY_ALL,
ce qui permet à d'autres applications de capturer la lecture. Vous pouvez procéder de plusieurs manières :
- Pour activer la capture sur tous les lecteurs, incluez
android:allowAudioPlaybackCapture="true"dans le fichiermanifest.xmlde l'application. - Vous pouvez également activer la capture sur tous les lecteurs en appelant
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Vous pouvez définir la règle sur un lecteur individuel lorsque vous le créez à l'aide de
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Si vous utilisezAAudio, appelezAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL).)
Si ces conditions préalables sont remplies, tout audio produit par le lecteur peut être capturé.
Désactiver la capture système
Les protections permettant la capture décrites ci-dessus ne s'appliquent qu'aux applications. Les composants du système Android peuvent capturer la lecture par défaut.
Nombre de ces composants sont personnalisés par les fournisseurs Android et prennent en charge des fonctionnalités telles que l'accessibilité et le sous-titrage. Pour cette raison, il est recommandé que les applications autorisent le système à capturer leur lecture. Dans le cas rare où vous ne
souhaitez pas que le système capture la lecture de votre application, définissez la règle de capture sur
ALLOW_CAPTURE_BY_NONE.
Définir la règle lors de l'exécution
Vous pouvez appeler AudioManager.setAllowedCapturePolicy() pour modifier la règle de capture pendant l'exécution d'une application. Si un MediaPlayer ou un AudioTrack est en cours de lecture lorsque vous appelez la méthode, l'audio n'est pas affecté. Vous devez fermer et rouvrir le lecteur ou la piste pour que la modification de la règle prenne effet.
Règle = fichier manifeste + AudioManager + AudioAttributes
Étant donné que la règle de capture peut être spécifiée à plusieurs endroits, il est important de comprendre comment la règle effective est déterminée.
La règle de capture la plus restrictive est toujours appliquée. Par exemple, une application dont le
fichier manifeste inclut setAllowedCapturePolicy="false" n'autorisera jamais les applications non système
à capturer son audio, même si AudioManager#setAllowedCapturePolicy est défini
sur ALLOW_CAPTURE_BY_ALL. De même, si le
AudioManager#setAllowedCapturePolicy est défini sur ALLOW_CAPTURE_BY_ALL et que le
fichier manifeste définit setAllowedCapturePolicy="true", mais que les
AudioAttributes du lecteur multimédia ont été créés avec
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), alors
ce lecteur multimédia ne pourra pas être capturé par des applications non système.
Le tableau ci-dessous récapitule l'effet de l'attribut de manifeste et de la règle effective :
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| vrai | n'importe quelle application | système uniquement | aucune capture |
| faux | système uniquement | système uniquement | aucune capture |