Rilevare quando gli utenti acquisiscono screenshot del dispositivo

Il messaggio indica "L'app Google Pay ha rilevato questo screenshot"
Figura 1. Un esempio del messaggio di notifica fornito dal sistema che viene visualizzato quando l'utente acquisisce uno screenshot di un'app che supporta l'API di rilevamento degli screenshot.

Per creare un'esperienza più standardizzata per il rilevamento degli screenshot, Android 14 introduce un'API per il rilevamento degli screenshot che tutela la privacy. Questa API consente alle app di registrare i callback in base all'attività. Questi callback vengono richiamati e l'utente riceve una notifica quando acquisisce uno screenshot mentre l'attività è visibile.

Casi d'uso supportati

In Android 14, l'API di sistema rileva uno screenshot solo se l'utente esegue una combinazione specifica di pressioni dei tasti hardware. L'API non rileva gli screenshot acquisiti durante l'esecuzione di comandi di test correlati agli screenshot, inclusi ADB o all'interno di test di strumentazione che acquisiscono i contenuti dello schermo corrente del dispositivo.

Passaggi per l'implementazione

Per aggiungere il rilevamento degli screenshot, dichiara la nuova autorizzazione DETECT_SCREEN_CAPTURE al momento dell'installazione:

<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />

Quindi, completa questi passaggi per ogni attività della tua app in cui gli utenti potrebbero acquisire screenshot:

  1. Implementa un callback eseguendo l'override della funzione onScreenCapture(). In questo callback, la tua app può intraprendere azioni, ad esempio avvisare un altro utente che qualcuno ha scattato uno screenshot di una conversazione di messaggistica.

    Kotlin

    val screenCaptureCallback = Activity.ScreenCaptureCallback {
        // Add logic to take action in your app.
    }

    Java

    final Activity.ScreenCaptureCallback screenCaptureCallback =
        new Activity.ScreenCaptureCallback() {
            @Override
            public void onScreenCaptured() {
                // Add logic to take action in your app.
            }
        };
  2. Nel metodo onStart() dell'attività, registra il callback dello screenshot.

    Kotlin

    override fun onStart() {
        super.onStart()
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(mainExecutor, screenCaptureCallback)
    }

    Java

    @Override
    protected void onStart() {
        super.onStart();
        // Pass in the callback created in the previous step 
        // and the intended callback executor (e.g. Activity's mainExecutor).
        registerScreenCaptureCallback(executor, screenCaptureCallback);
    }
  3. Nel metodo onStop() dell'attività, annulla la registrazione del callback dello screenshot:

    Kotlin

    override fun onStop() {
        super.onStop()
        unregisterScreenCaptureCallback(screenCaptureCallback)
    }

    Java

    @Override
    protected void onStop() {
        super.onStop();
        unregisterScreenCaptureCallback(screenCaptureCallback);
    }

Controllare la possibilità di acquisire screenshot

Se non vuoi che i contenuti dell'attività di un'app vengano visualizzati negli screenshot o su display non sicuri, imposta il flag di visualizzazione FLAG_SECURE.

Kotlin

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE)

Java

activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);