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 che riproduce.
Come gestire un token MediaProjection
L'API MediaProjection consente alle app di acquisire un token MediaProjection che concede 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'interfaccia utente 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 audio silenzioso o uno stream video nero.
Per gestire la perdita di un token, registra un callback nell'istanza MediaProjection utilizzando il metodo registerCallback e interrompi la registrazione quando viene chiamato il metodo onStop.
Per saperne di più, consulta Proiezione di contenuti multimediali.
Registra video
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'analogo 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.
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:
- L'app deve disporre dell'autorizzazione
RECORD_AUDIO. - L'app deve mostrare il prompt 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 oggetto AudioRecord e aggiungervi un AudioPlaybackCaptureConfiguration. Procedi nel seguente modo:
- Chiama
AudioPlaybackCaptureConfiguration.Builder.build()per creare unAudioPlaybackCaptureConfiguration. - Passa la configurazione a
AudioRecordchiamandosetAudioPlaybackCaptureConfig.
Controllo dell'acquisizione audio
La tua app può controllare i tipi di contenuti che può registrare e quali altri tipi di app possono registrare la sua riproduzione.
Limitazione dell'acquisizione in base ai contenuti audio
Un'app può limitare l'audio che può acquisire utilizzando questi metodi:
- Passa un
AUDIO_USAGEad AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() per consentire l'acquisizione di un utilizzo specifico. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un
AUDIO_USAGEad AudioPlaybackCaptureConfiguration.excludeUsage() per impedire l'acquisizione di quell'utilizzo. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un UID ad 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 ad AudioPlaybackCaptureConfiguration.excludeUid() per impedire l'acquisizione di quell'UID. Chiama il metodo più volte per specificare più di un UID.
Tieni presente che non puoi utilizzare i metodi addMatchingUsage() e excludeUsage()
insieme. Devi scegliere una o l'altra opzione. Analogamente, non puoi utilizzare addMatchingUid() e excludeUid() contemporaneamente.
Limitazione dell'acquisizione da parte di altre app
Puoi configurare un'app in modo da 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.
Policy di acquisizione
La policy di acquisizione del player deve essere
AudioAttributes.ALLOW_CAPTURE_BY_ALL,
che consente ad altre app di acquisire la riproduzione. Puoi farlo 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 policy su un singolo player quando lo crei utilizzando
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Se utilizziAAudio, chiamaAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL).)
Se questi prerequisiti sono soddisfatti, è possibile acquisire qualsiasi audio prodotto dal player.
Disattivazione dell'acquisizione del 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 Android e supportano funzionalità come l'accessibilità e i sottotitoli codificati. Per questo motivo, è consigliabile che le app
consentano al sistema di acquisire la loro riproduzione. Nel raro caso in cui non vuoi che il sistema acquisisca la riproduzione della tua app, imposta il criterio di acquisizione su ALLOW_CAPTURE_BY_NONE.
Impostazione della policy in fase di runtime
Puoi chiamare AudioManager.setAllowedCapturePolicy() per modificare il criterio di acquisizione mentre un'app è in esecuzione. Se un MediaPlayer o un AudioTrack è in riproduzione quando chiami il metodo, l'audio non viene interessato. Per applicare la modifica della policy, devi chiudere e riaprire il player o la traccia.
Policy = manifest + AudioManager + AudioAttributes
Poiché la policy di acquisizione può essere specificata in più posizioni, è importante capire come viene determinata la policy effettiva.
Viene sempre applicata la policy 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 proprio audio, anche se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL. Analogamente, se AudioManager#setAllowedCapturePolicy è impostato su ALLOW_CAPTURE_BY_ALL e il manifest imposta setAllowedCapturePolicy="true", ma i AudioAttributes del media player sono stati creati con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), questo media player non sarà acquisibile da app non di sistema.
La tabella seguente riassume l'effetto dell'attributo del manifest e della policy effettiva:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| true | qualsiasi app | solo sistema | no capture |
| false | solo sistema | solo sistema | no capture |