Acquisisci la riproduzione video e audio

Un'app può registrare il video o l'audio riprodotto da un'altra app. Queste app devono gestire correttamente il token MediaProjection. Questa pagina spiega come fare. Mostra anche come un amministratore del dispositivo può disattivare la possibilità di registrare qualsiasi istantanea dello schermo e come un'app audio può impedire ad altre app di registrare i contenuti riprodotti.

Come gestire un token MediaProjection

L'API MediaProjection consente alle app di acquisire un token MediaProjection che offre l'accesso una tantum per acquisire i contenuti dello schermo o l'audio. Il sistema operativo Android chiede all'utente l'autorizzazione prima di concedere il token alla tua app.

Il sistema operativo mostra i token MediaProjection attivi nell'interfaccia utente delle Impostazioni rapide e consente agli utenti di revocare l'accesso a un token in qualsiasi momento. In questo caso, i display virtuali o i flussi audio associati alla sessione smettono di ricevere flussi multimediali. La tua app deve rispondere in modo appropriato, altrimenti continuerà a registrare silenzio audio o un flusso video nero.

Per gestire la perdita di un token, registra un callback sull'istanza MediaProjection utilizzando il metodo registerCallback e interrompi la registrazione quando viene chiamato il metodo onStop.

Per ulteriori informazioni, vedi Proiezione multimediale.

Registra video

Consulta l'app di esempio ScreenCapture per scoprire come utilizzare l'API Media Projection per acquisire la schermata di un dispositivo in tempo reale e mostrarla su una SurfaceView.

Puoi utilizzare DevicePolicyManager per impedire la registrazione dello schermo. Per gli account aziendali (Android for Work), l'amministratore può disattivare la raccolta dei dati dell'assistente per il profilo di lavoro utilizzando il metodo setScreenCaptureDisabled.

Il codelab Managing Android Devices Without an App mostra come vietare gli screenshot.

Acquisire la riproduzione audio

L'API AudioPlaybackCapture è stata introdotta in Android 10. Questa API consente alle app di copiare l'audio riprodotto da altre app. Questa funzionalità è l'equivalente dell'acquisizione schermo, ma per l'audio. Il caso d'uso principale è per le app di streaming che vogliono acquisire l'audio riprodotto dai giochi.

Tieni presente che l'API AudioPlaybackCapture non influisce sulla latenza dell'app il cui audio viene acquisito.

Creazione di un'app di acquisizione

Per motivi di sicurezza e privacy, l'acquisizione della riproduzione impone alcune limitazioni. Per poter acquisire l'audio, un'app deve soddisfare i seguenti requisiti:

Per acquisire l'audio da un'altra app, la tua app deve creare un oggetto AudioRecord e aggiungervi un AudioPlaybackCaptureConfiguration. Procedi nel seguente modo:

  1. Chiama AudioPlaybackCaptureConfiguration.Builder.build() per creare un AudioPlaybackCaptureConfiguration.
  2. Trasferisci la configurazione a AudioRecord chiamando setAudioPlaybackCaptureConfig.

Controllare l'acquisizione audio

La tua app può controllare i tipi di contenuti che può registrare e quali altri tipi di app possono registrare la propria riproduzione.

Limitazione dell'acquisizione in base ai contenuti audio

Un'app può limitare l'audio che può acquisire utilizzando questi metodi:

Tieni presente che non puoi utilizzare i metodi addMatchingUsage() e excludeUsage() insieme. Devi scegliere una delle due opzioni. Allo stesso modo, non puoi utilizzare addMatchingUid() e excludeUid() contemporaneamente.

Limitazione dell'acquisizione da parte di altre app

Puoi configurare un'app per impedire ad altre app di acquisire il suo audio. L'audio proveniente da un'app può essere acquisito solo se l'app soddisfa i seguenti requisiti:

Utilizzo

Il player che produce l'audio deve impostare il suo utilizzo su USAGE_MEDIA, USAGE_GAME o USAGE_UNKNOWN.

Norme di acquisizione

Le norme di acquisizione del player devono essere AudioAttributes.ALLOW_CAPTURE_BY_ALL, che consente ad altre app di acquisire la riproduzione. Puoi farlo in diversi modi:

Se questi prerequisiti sono soddisfatti, è possibile acquisire qualsiasi audio prodotto dal lettore.

Disattivazione dell'acquisizione di sistema

Le protezioni che consentono l'acquisizione descritte sopra si applicano solo alle app. I componenti di sistema Android possono acquisire la riproduzione per impostazione predefinita. Molti di questi componenti sono personalizzati dai fornitori di Android e supportano funzionalità come l'accessibilità e i sottotitoli codificati. Per questo motivo, è consigliabile che le app consentano al sistema di acquisire la riproduzione. Nel raro caso in cui non vuoi che il sistema acquisisca la riproduzione della tua app, imposta le norme di acquisizione su ALLOW_CAPTURE_BY_NONE.

Impostazione delle norme in fase di runtime

Puoi chiamare AudioManager.setAllowedCapturePolicy() per modificare la policy di acquisizione mentre un'app è in esecuzione. Se un MediaPlayer o AudioTrack è in riproduzione quando chiami il metodo, l'audio non viene interessato. Devi chiudere e riaprire il player o la traccia affinché la modifica alla policy venga applicata.

Policy = manifest + AudioManager + AudioAttributes

Poiché la norma di acquisizione può essere specificata in più posizioni, è importante capire come viene determinata la norma effettiva. Viene sempre applicata la norma di acquisizione più restrittiva. Ad esempio, un'app il cui manifest include setAllowedCapturePolicy="false" non consentirà mai ad app non di sistema di acquisire il suo audio, anche se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL. Allo stesso modo, se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL e il manifest imposta setAllowedCapturePolicy="true", ma AudioAttributes del lettore multimediale sono stati creati con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), questo lettore multimediale non potrà essere acquisito da app non di sistema.

La tabella seguente riassume l'effetto dell'attributo manifest e delle norme effettive:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
true qualsiasi app solo sistema nessuna acquisizione
falso solo sistema solo sistema nessuna acquisizione