Un'app può registrare il video o l'audio in riproduzione da un'altra app. Tali app devono gestire correttamente il token MediaProjection
. In questa pagina viene spiegato come. Viene inoltre spiegato come l'amministratore di un dispositivo può disattivare la possibilità di registrare istantanee delle schermate 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 concede loro un accesso una tantum
per acquisire contenuti dello schermo o 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 gli stream audio associati alla sessione non ricevono più 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 nell'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 l'app di esempio Screen Capture per scoprire come utilizzare l'API Media Projection per acquisire lo schermo di un dispositivo in tempo reale e mostrarlo su SurfaceView.
Puoi utilizzare la 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 setScreen CaptureDisabled.
Il codelab Gestione dei dispositivi Android senza un'app mostra come vietare gli screenshot.
Acquisisci riproduzione audio
L'API AudioPlayback Capture è stata introdotta in Android 10. Questa API consente alle app di copiare l'audio riprodotto da altre app. Questa funzionalità è l'analogico dell'acquisizione dello schermo, ma per l'audio. Il caso d'uso principale riguarda 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 di cui viene acquisito l'audio.
Creazione di un'app di acquisizione
Per motivi di sicurezza e privacy, l'acquisizione delle riproduzioni impone alcune limitazioni. Per acquisire l'audio, un'app deve soddisfare i seguenti requisiti:
- L'app deve disporre dell'autorizzazione
RECORD_AUDIO
. - L'app deve visualizzare la richiesta visualizzata da
MediaProjectionManager.createScreenCaptureIntent()
e l'utente deve approvarla. - Le app di acquisizione e riproduzione devono essere nello stesso profilo utente.
Per acquisire l'audio da un'altra app, l'app deve creare un oggetto AudioRecord
e aggiungere un oggetto AudioPlaybackCaptureConfiguration
. Procedi come descritto di seguito:
- Chiama il numero
AudioPlaybackCaptureConfiguration.Builder.build()
per creare unAudioPlaybackCaptureConfiguration
. - Passa la configurazione a
AudioRecord
chiamandosetAudioPlaybackCaptureConfig
.
Controllo dell'acquisizione dell'audio
L'app può controllare i tipi di contenuti che può registrare e i tipi di altri tipi di app che possono registrare la propria riproduzione.
Acquisizione vincolata da contenuti audio
Un'app può limitare l'audio che può acquisire utilizzando questi metodi:
- Passa un valore
AUDIO_USAGE
a AudioPlaybackAcquisisciConfiguration.addMatchingUsage() per consentire l'acquisizione di un utilizzo specifico. Richiama il metodo più volte per specificare più utilizzi. - Passa un valore
AUDIO_USAGE
a AudioPlaybackAcquisisciConfiguration.excludeUsage() per vietare l'acquisizione di questo utilizzo. Richiama il metodo più volte per specificare più utilizzi. - Passa un UID a AudioPlaybackAcquisisciConfiguration.addMatchingUid() per acquisire solo le app con un UID specifico. Richiama il metodo più volte per specificare più di un UID.
- Passa un UID a AudioPlaybackAcquisisciConfiguration.excludeUid() per vietare l'acquisizione di questo UID. Richiama 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.
Vincolo dell'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 quest'ultima 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
La norma di acquisizione del player deve essere AudioAttributes.ALLOW_CAPTURE_BY_ALL
, in modo da consentire 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.xml
dell'app. - Puoi anche attivare l'acquisizione per tutti i giocatori chiamando il numero
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Puoi impostare il criterio per un singolo giocatore 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, l'audio prodotto dal player può essere acquisito.
Disattivazione dell'acquisizione del sistema in corso...
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 funzioni
come l'accessibilità e i sottotitoli. 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 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 il criterio
di acquisizione mentre l'app è in esecuzione. Se chiami il metodo Media Player o AudioTrack
è in riproduzione, l'audio non viene influenzato. Devi chiudere e riaprire il player o il canale per applicare la modifica alle norme.
Norme = manifest + AudioManager + AudioAttributes
Poiché il criterio di acquisizione può essere specificato in più punti, è importante capire come viene determinato il criterio effettivo.
Viene sempre applicata la norma di acquisizione più restrittiva. Ad esempio, un'app il cui file manifest include setAllowedCapturePolicy="false"
non consentirà mai alle app non di sistema di acquisire il relativo audio, anche se AudioManager#setAllowedCapturePolicy
è impostato su ALLOW_CAPTURE_BY_ALL
. Allo stesso modo, se l'elemento AudioManager#setAllowedCapturePolicy
è impostato su ALLOW_CAPTURE_BY_ALL
e il file manifest imposta setAllowedCapturePolicy="true"
, ma l'AudioAttributes
del media player è stato creato con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, questo media player non potrà essere attivato dalle app non di sistema.
La tabella riportata di seguito riassume l'effetto dell'attributo manifest e del criterio effettivo:
allowAudioRiproduzione Capture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SISTEMA | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | qualsiasi app | solo sistema | nessuna acquisizione |
false | solo sistema | solo sistema | nessuna acquisizione |