Une application peut enregistrer la vidéo ou l'audio en cours de lecture à partir d'une autre application. Ces applications doivent gérer correctement le jeton MediaProjection
. Cette page vous explique comment procéder. Il montre également comment un administrateur d'appareil peut désactiver la possibilité d'enregistrer des instantanés d'écran et comment une application audio peut empêcher d'autres applications d'enregistrer le contenu lu.
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'utilisateur son autorisation 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. Dans le cas contraire, elle continuera d'enregistrer un silence audio ou un flux vidéo noir.
Pour gérer la perte d'un jeton, enregistrez un rappel sur l'instance MediaProjection
à l'aide de la méthode registerCallback
et arrêtez l'enregistrement lorsque la méthode onStop
est appelée.
Pour en savoir plus, consultez la section Projection multimédia.
Enregistrer une vidéo
Consultez l'application exemple ScreenCapture pour apprendre à 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 d'écran. Pour les comptes d'entreprise (Android for Work), l'administrateur peut désactiver la collecte des 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.
Enregistrer la lecture audio
L'API AudioPlaybackCapture a été introduite dans Android 10. Cette API permet aux applications de copier le contenu audio lu par d'autres applications. Cette fonctionnalité est l'équivalent de la capture d'écran, mais pour l'audio. Le cas d'utilisation principal concerne les applications de streaming qui souhaitent capturer le contenu audio des jeux.
Notez que l'API AudioPlaybackCapture n'affecte pas la latence de l'application dont le contenu audio est capturé.
Créer une application de capture
Pour des raisons de sécurité et de confidentialité, l'enregistrement de la lecture présente certaines limites. Pour pouvoir enregistrer du contenu audio, une application doit remplir les conditions suivantes:
- L'application doit disposer de l'autorisation
RECORD_AUDIO
. - 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 appartenir au même profil utilisateur.
Pour capturer le contenu audio d'une autre application, votre application doit créer un objet AudioRecord
et y ajouter un AudioPlaybackCaptureConfiguration
. Procédez comme suit :
- Appelez
AudioPlaybackCaptureConfiguration.Builder.build()
pour créer uneAudioPlaybackCaptureConfiguration
. - Transmettez la configuration à
AudioRecord
en appelantsetAudioPlaybackCaptureConfig
.
Contrôler la capture audio
Votre application peut contrôler les types de contenus 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 les contenus audio qu'elle peut enregistrer à l'aide des méthodes suivantes:
- Transmettez un
AUDIO_USAGE
à AudioPlaybackCaptureConfiguration.addMatchingUsage() pour permettre la capture d'une utilisation spécifique. Appelez la méthode plusieurs fois pour spécifier plusieurs utilisations. - Transmettez un
AUDIO_USAGE
à AudioPlaybackCaptureConfiguration.excludedUsage() 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 ayant un UID spécifique. Appelez la méthode plusieurs fois pour spécifier plusieurs UID.
- Transmettez un UID à AudioPlaybackCaptureConfiguration.excludedUid() 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 ces options. De même, vous ne pouvez pas utiliser simultanément addMatchingUid()
et excludeUid()
.
Limiter la capture par d'autres applications
Vous pouvez configurer une application de sorte qu'elle empêche d'autres applications d'enregistrer son contenu audio. Le son provenant d'une application ne peut être capturé que si celle-ci remplit les conditions suivantes:
Utilisation
Le lecteur qui produit le contenu 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. Pour ce faire, vous disposez de différentes méthodes:
- Pour activer la capture sur tous les lecteurs, incluez
android:allowAudioPlaybackCapture="true"
dans le fichiermanifest.xml
de l'application. - Vous pouvez également activer la capture sur tous les joueurs en appelant
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Vous pouvez définir la règle au niveau d'un lecteur individuel lorsque vous la compilez à l'aide de
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. (Si vous utilisezAAudio
, appelezAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
.)
Si ces conditions sont remplies, tout contenu audio produit par le lecteur peut être capturé.
Désactiver la capture du système
Les protections permettant la capture décrites ci-dessus ne s'appliquent qu'aux applications. Les composants système Android peuvent capturer la lecture par défaut.
Beaucoup de ces composants sont personnalisés par des fournisseurs Android et prennent en charge des fonctionnalités telles que l'accessibilité et les sous-titres. C'est pourquoi il est recommandé que les applications permettent au système d'enregistrer leur lecture. Dans les rares cas 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 une règle au moment 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 AudioTrack est en cours de lecture lorsque vous appelez la méthode, l'audio n'est pas affecté. Vous devez fermer, puis rouvrir le lecteur ou le canal pour que la modification des règles soit prise en compte.
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 en vigueur 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 contenu audio, même si AudioManager#setAllowedCapturePolicy
est défini sur ALLOW_CAPTURE_BY_ALL
. De même, si AudioManager#setAllowedCapturePolicy
est défini sur ALLOW_CAPTURE_BY_ALL
et que le fichier manifeste définit setAllowedCapturePolicy="true"
, mais que le AudioAttributes
du lecteur multimédia a été créé avec AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, ce lecteur multimédia ne pourra pas être capturé par des applications autres que les applications système.
Le tableau ci-dessous résume l'effet de l'attribut de fichier manifeste et de la règle applicable:
allowAudioPlaybackCapture | AUTORISER_CAPTURE_PAR_TOUT | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
vrai | n'importe quelle application | système uniquement | aucune capture |
false | système uniquement | système uniquement | aucune capture |