Un'app può registrare il video o l'audio riprodotto da un'altra app. Queste
app devono gestire correttamente il
MediaProjection token. Questa pagina spiega come. Mostra anche come un amministratore del dispositivo può disattivare la possibilità di registrare gli snapshot dello schermo e come un'app audio può impedire ad altre app di registrare i contenuti che riproduce.
Come gestire un token MediaProjection
L'MediaProjection API
consente alle app di acquisire un token MediaProjection che fornisce loro 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'UI delle Impostazioni rapide e consente agli utenti di ritirare 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. La tua app deve rispondere in modo appropriato, altrimenti continuerà a registrare il silenzio audio o uno stream video nero.
Per gestire la perdita di un token, registra un callback sull'MediaProjection
istanza utilizzando il
registerCallback
metodo e interrompi la registrazione quando viene chiamato il
onStop
metodo.
Per saperne di più, consulta Proiezione multimediale.
Registra video
Consulta l'app di esempio ScreenCapture per scoprire come utilizzare l'API Media Projection per acquisire lo schermo di un dispositivo in tempo reale e visualizzarlo su un 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 Gestione dei dispositivi Android senza un'app mostra 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 AudioPlaybackCapture non influisce sulla latenza dell'app di cui viene acquisito l'audio.
Creare 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 questi requisiti:
- L'app deve avere l'
RECORD_AUDIOautorizzazione. - L'app deve visualizzare il messaggio visualizzato da
MediaProjectionManager.createScreenCaptureIntent(), e l'utente deve approvarlo. - Le app di acquisizione e riproduzione devono trovarsi nello stesso profilo utente.
Per acquisire l'audio da un'altra app, la tua app deve creare un
AudioRecord oggetto
e aggiungervi un
AudioPlaybackCaptureConfiguration. Procedi nel seguente modo:
- Chiama
AudioPlaybackCaptureConfiguration.Builder.build()per creare unAudioPlaybackCaptureConfiguration. - Passa la configurazione a
AudioRecordchiamandosetAudioPlaybackCaptureConfig.
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.
Limitare l'acquisizione in base ai contenuti audio
Un'app può limitare l'audio che può acquisire utilizzando questi metodi:
- Passa un
AUDIO_USAGEa AudioPlaybackCaptureConfiguration.addMatchingUsage() per consentire l'acquisizione di un utilizzo specifico. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un
AUDIO_USAGEa AudioPlaybackCaptureConfiguration.excludeUsage() per impedire l'acquisizione di questo utilizzo. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un UID a AudioPlaybackCaptureConfiguration.addMatchingUid() per acquisire solo le app con un UID specifico. Chiama il metodo più volte per specificare più di un UID.
- Passa un UID a AudioPlaybackCaptureConfiguration.excludeUid() per impedire l'acquisizione di questo UID. Chiama il metodo più volte per specificare più di un UID.
Tieni presente che non puoi utilizzare contemporaneamente i metodi addMatchingUsage() e excludeUsage(). Devi scegliere uno o l'altro. Allo stesso modo, non puoi utilizzare addMatchingUid() e excludeUid() contemporaneamente.
Limitare l'acquisizione in base ad 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 questi requisiti:
Utilizzo
Il player che produce l'audio deve impostare l'utilizzo
su USAGE_MEDIA,
USAGE_GAME o
USAGE_UNKNOWN.
Norma di acquisizione
La norma di acquisizione del player deve essere
AudioAttributes.ALLOW_CAPTURE_BY_ALL,
che consente ad altre app di acquisire la riproduzione. Questa operazione può essere eseguita in diversi modi:
- Per attivare l'acquisizione su tutti i player, includi
android:allowAudioPlaybackCapture="true"nel filemanifest.xmldell'app. - Puoi anche attivare l'acquisizione su tutti i player chiamando
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Puoi impostare la norma su un singolo player quando lo crei utilizzando
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Se utilizziAAudiochiamaAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL).)
Se questi prerequisiti sono soddisfatti, è possibile acquisire qualsiasi audio prodotto dal player.
Disattivare l'acquisizione del sistema
Le protezioni che consentono l'acquisizione descritte sopra si applicano solo alle app. Per impostazione predefinita, i componenti di sistema Android possono acquisire la riproduzione.
Molti di questi componenti sono personalizzati dai fornitori di Android e supportano funzionalità come l'accessibilità e i sottotitoli. 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 la norma di acquisizione su ALLOW_CAPTURE_BY_NONE.
Impostare la norma in fase di runtime
Puoi chiamare AudioManager.setAllowedCapturePolicy() per modificare la norma 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 della norma abbia effetto.
Norma = 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 alle app non di sistema
di acquisire il suo audio, anche se AudioManager#setAllowedCapturePolicy è impostato
su ALLOW_CAPTURE_BY_ALL. Allo stesso modo, se il
AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL e il
manifest imposta setAllowedCapturePolicy="true", ma gli
AudioAttributes del media player sono stati creati con
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), allora
questo media player non potrà essere acquisito da app non di sistema.
La tabella seguente riassume l'effetto dell'attributo del manifest e della norma effettiva:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| true | Qualsiasi app | Solo sistema | Nessuna acquisizione |
| false | Solo sistema | Solo sistema | Nessuna acquisizione |