Un'app può registrare il video o l'audio in riproduzione da un'altra app. Queste app devono gestire correttamente il token MediaProjection
. In questa pagina viene spiegato come fare. Viene inoltre spiegato in che modo un amministratore del dispositivo può disattivare
la possibilità di registrare eventuali istantanee 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 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 riceveranno più stream multimediali. L'app deve rispondere correttamente, 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
Vedi 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 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 setScreen CaptureDisabled.
Il codelab Gestire i dispositivi Android senza un'app mostra come vietare gli screenshot.
Acquisisci la 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à è analoga all'acquisizione dello schermo, ma per l'audio. Il caso d'uso principale è 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 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 visualizzare la richiesta visualizzata da
MediaProjectionManager.createScreenCaptureIntent()
e l'utente deve approvarla. - Le app di acquisizione e riproduzione devono trovarsi nello stesso profilo utente.
Per acquisire l'audio da un'altra app, quest'ultima deve creare un oggetto AudioRecord
e aggiungere un AudioPlaybackCaptureConfiguration
. Procedi come descritto di seguito:
- Chiama
AudioPlaybackCaptureConfiguration.Builder.build()
per creare unaAudioPlaybackCaptureConfiguration
. - Passa la configurazione a
AudioRecord
chiamandosetAudioPlaybackCaptureConfig
.
Controllo dell'acquisizione dell'audio
L'app può controllare i tipi di contenuti che può registrare e quali altri tipi di app possono registrare la propria riproduzione.
Vincolo di acquisizione da parte di contenuti audio
Un'app può limitare l'audio che può acquisire utilizzando i seguenti metodi:
- Passa un valore
AUDIO_USAGE
ad AudioPlayback CaptureConfiguration.addMatchingUsage() per consentire di acquisire un utilizzo specifico. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un valore
AUDIO_USAGE
all'elemento AudioPlayback CaptureConfiguration.excludedUsage() per impedire di acquisire tale utilizzo. Chiama il metodo più volte per specificare più di un utilizzo. - Trasmetti un UID a AudioPlayback CaptureConfiguration.addMatchingUid() per acquisire solo le app con uno specifico UID. Chiama il metodo più volte per specificare più di un UID.
- Passa un UID a AudioPlayback CaptureConfiguration.isconoUid() per vietare 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 l'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 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
.
Acquisisci criterio
La norma di acquisizione del player deve essere
AudioAttributes.ALLOW_CAPTURE_BY_ALL
,
che consente ad altre app di acquisire la riproduzione. Esistono vari modi per farlo:
- Per abilitare l'acquisizione su tutti i player, includi
android:allowAudioPlaybackCapture="true"
nel filemanifest.xml
dell'app. - Puoi anche attivare l'acquisizione su tutti i giocatori chiamando
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Puoi impostare il criterio 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, sarà 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. 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 registrare la 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 del criterio in fase di runtime
Puoi chiamare AudioManager.setAllowedCapturePolicy()
per modificare il criterio
di acquisizione mentre un'app è in esecuzione. Se un MediaPlayer o AudioTrack viene riprodotto quando chiami il metodo, l'audio non è interessato. Per applicare la modifica alle norme, devi chiudere e riaprire
il player o la traccia.
Norma = manifest + AudioManager + AudioAttributes
Poiché la norma di acquisizione può essere specificata in più punti, è importante capire come viene determinata la norma effettiva.
Viene sempre applicata la norma di acquisizione più restrittiva. Ad esempio, un'app il cui
file manifest include setAllowedCapturePolicy="false"
non consentirà mai ad app
non di sistema di acquisire il proprio audio, anche se il valore AudioManager#setAllowedCapturePolicy
è impostato
su ALLOW_CAPTURE_BY_ALL
. In modo simile, se il AudioManager#setAllowedCapturePolicy
è impostato su ALLOW_CAPTURE_BY_ALL
e il file manifest imposta setAllowedCapturePolicy="true"
, ma il media player AudioAttributes
è stato creato con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, questo media player non potrà essere acquisito dalle app non di sistema.
La tabella seguente riassume l'effetto dell'attributo manifest e la norma effettiva:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | CONSENTI_CAPTURE_PER_SISTEMA | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | qualsiasi app | solo sistema | nessuna acquisizione |
false | solo sistema | solo sistema | nessuna acquisizione |