Capturer la lecture vidéo et audio

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. Elle indique é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 à l'utilisateur avant d'accorder le jeton à votre application.

L'OS affiche les jetons MediaProjection actifs dans l'interface utilisateur des paramètres rapides et permet aux utilisateurs de révoquer l'accès à un jeton à tout moment. Dans ce cas, les affichages 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'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 Projection de contenu multimédia.

Enregistrer une vidéo

Consultez l'exemple d'application 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 Enterprise (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 montre comment interdire les captures d'écran.

Capturer 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 principal cas d'utilisation concerne les applications de streaming qui souhaitent capturer l'audio des 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 de l'audio, une application doit répondre aux exigences suivantes :

Pour capturer l'audio d'une autre application, votre application doit créer un objet AudioRecord et y ajouter un AudioPlaybackCaptureConfiguration. Procédez comme suit :

  1. Appelez AudioPlaybackCaptureConfiguration.Builder.build() pour créer un AudioPlaybackCaptureConfiguration.
  2. Transmettez la configuration à AudioRecord en appelant setAudioPlaybackCaptureConfig.

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 sa propre lecture.

Limiter la capture par contenu audio

Une application peut limiter l'audio qu'elle peut capturer à l'aide des méthodes suivantes :

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 contenu 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

Le paramètre de capture du lecteur doit être défini sur AudioAttributes.ALLOW_CAPTURE_BY_ALL, ce qui permet aux autres applications de capturer la lecture. Pour ce faire, vous avez le choix entre plusieurs méthodes :

Si ces conditions préalables sont remplies, tout contenu 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 système Android peuvent capturer la lecture par défaut. Bon 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. C'est pourquoi nous recommandons aux applications d'autoriser le système à capturer leur lecture. Dans le rare 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 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 le changement de règlement 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 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 les AudioAttributes du lecteur multimédia ont été créés avec AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), 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 du fichier manifeste et de la stratégie en vigueur :

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true n'importe quelle application système uniquement aucune capture
false système uniquement système uniquement aucune capture