Acquisisci la riproduzione video e audio

Un'app può registrare l'audio o il video in riproduzione da un'altra app. Tale le app devono gestire MediaProjection token in modo corretto. In questa pagina viene spiegato come fare. Inoltre, mostra come un amministratore del dispositivo può disattivare la possibilità di registrare gli screenshot 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 dà loro un accesso una tantum per acquisire contenuti dello schermo o audio. Il sistema operativo Android chiede all'utente 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 gli stream audio associati alla sessione smettono di ricevere stream multimediali. L'app deve rispondere in modo appropriato, altrimenti continuerà a registrare silenzio audio o uno stream 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, consulta la sezione Proiezione di contenuti multimediali.

Registra video

Consulta le App di esempio Screen Capture per scoprire come utilizzare l'API Media Projection per acquisire lo stato lo schermo in tempo reale e mostrarlo su SurfaceView.

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

Il codelab Gestire i dispositivi Android senza un'app spiega come vietare gli screenshot.

Acquisisci 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 dello 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 AudioPlayback Capture non influisce sulla latenza dell'app il cui audio viene durante l'acquisizione.

Creazione di un'app di acquisizione

Per motivi di sicurezza e privacy, la registrazione 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, questa deve creare un Oggetto AudioRecord e aggiungi un'etichetta AudioPlaybackCaptureConfiguration che le sono assegnati. Procedi nel seguente modo:

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

Controllo dell'acquisizione dell'audio

L'app può stabilire quali tipi di contenuti può registrare e quali altri tipi di app possono registrare la propria riproduzione.

Limitare l'acquisizione in base ai contenuti audio

Un'app può limitare l'audio che può acquisire usando questi metodo:

Tieni presente che non puoi utilizzare i metodi addMatchingUsage() e excludeUsage() in sinergia. Devi scegliere una o l'altra opzione. Analogamente, non puoi utilizzare addMatchingUid() e excludeUid() contemporaneamente.

Limitazioni all'acquisizione da parte di altre app

Puoi configurare un'app in modo da impedire ad altre app di acquisire il relativo 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 impostarne l'utilizzo su USAGE_MEDIA, USAGE_GAME o USAGE_UNKNOWN.

Criterio di acquisizione

Le norme relative alle acquisizioni del player devono essere impostate su AudioAttributes.ALLOW_CAPTURE_BY_ALL, che consente ad altre app di acquisire la riproduzione. Esistono vari modi per farlo:

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

Disattivazione dell'acquisizione del sistema in corso...

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

Impostazione del criterio in fase di runtime

Puoi chiamare AudioManager.setAllowedCapturePolicy() per modificare l'acquisizione mentre un'app è in esecuzione. Se un MediaPlayer o un AudioTrack è in riproduzione quando chiami il metodo, l'audio non viene interessato. Devi chiudere e riaprire al player o alla traccia per rendere effettiva la modifica del criterio.

Norma = manifest + AudioManager + AudioAttributes

Poiché la norma di acquisizione può essere specificata in più punti, è importante per capire come viene determinata la norma efficace. Viene sempre applicata la norma di acquisizione più restrittiva. Ad esempio, un'app il cui manifest include setAllowedCapturePolicy="false" non consentirà mai alle app non di sistema di acquisire il suo audio, anche se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL. Analogamente, se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL e il file manifest imposta setAllowedCapturePolicy="true", ma il valore AudioAttributes sono state create con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), poi non sarà possibile acquisire questo media player dalle app non di sistema.

La tabella seguente riassume l'effetto dell'attributo manifest e norma in vigore:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
vero qualsiasi app solo sistema Nessuna acquisizione
falso solo sistema solo sistema nessuna acquisizione