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. Mostra inoltre come un amministratore del dispositivo può disattivare
registrare qualsiasi istantanea dello schermo e in che modo 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 all'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 questi casi,
i display virtuali o gli stream audio associati alla sessione non riceveranno più
stream multimediali. L'app deve rispondere in modo appropriato, altrimenti continuerà
per registrare il silenzio audio o uno stream video nero.
Per gestire la perdita di un token, registra un callback su MediaProjection
utilizzando
registerCallback
e interrompi la registrazione quando
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 la 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 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. Questo è l'analogia dell'acquisizione 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, l'acquisizione della riproduzione impone alcune limitazioni. Per poter acquisire l'audio, un'app deve soddisfare i seguenti requisiti:
- L'app deve avere
RECORD_AUDIO
autorizzazione. - L'app deve visualizzare la richiesta
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, questa deve creare un
Oggetto AudioRecord
e aggiungi un'etichetta
AudioPlaybackCaptureConfiguration
che le sono assegnati. Procedi nel seguente modo:
- Chiama il numero
AudioPlaybackCaptureConfiguration.Builder.build()
per creare unAudioPlaybackCaptureConfiguration
. - Passa la configurazione a
AudioRecord
chiamandosetAudioPlaybackCaptureConfig
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.
Vincolo di acquisizione da parte di contenuti audio
Un'app può limitare l'audio che può acquisire usando questi metodo:
- Supera
AUDIO_USAGE
per AudioPlaybackCaptureConfiguration.addMatchingUsage() per consentire l'acquisizione di un uso specifico. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un valore
AUDIO_USAGE
all'elemento AudioPlayback CaptureConfiguration.excludedUsage() per non è consentito acquisire quell'uso. Chiama il metodo più volte per specificare più di un utilizzo. - Passa un UID ad 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()
in sinergia. Devi scegliere l'una o l'altra opzione. Allo stesso modo, 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
per USAGE_MEDIA
,
USAGE_GAME
oppure
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 attivare l'acquisizione su tutti i player, includi
android:allowAudioPlaybackCapture="true"
nell'appmanifest.xml
file. - 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. 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 AudioTrack è in riproduzione
quando chiami il metodo, l'audio non subirà modifiche. 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 la cui
il file manifest include setAllowedCapturePolicy="false"
non consentirà mai
delle app per acquisire l'audio, anche se è impostata l'opzione AudioManager#setAllowedCapturePolicy
a 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 | CONSENTI_CAPTURE_PER_SISTEMA | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
vero | qualsiasi app | solo sistema | nessuna acquisizione |
falso | solo sistema | solo sistema | nessuna acquisizione |