Detectar quando usuários fazem capturas de tela no dispositivo

Mensagem que diz "O app Google Pay detectou essa captura de tela"
Figura 1. Exemplo de mensagem de aviso do sistema que aparece quando o usuário faz uma captura de tela de um app com suporte à API de detecção de capturas de tela.

Para criar uma experiência mais padronizada para detectar capturas de tela, o Android 14 apresenta uma API de detecção de capturas de tela que preserva a privacidade. Ela permite que os apps registrem callbacks por atividade. Esses callbacks são invocados, e o usuário é notificado quando faz uma captura de tela enquanto a atividade está visível.

Casos de uso com suporte

No Android 14, a API do sistema só detecta uma captura de tela quando o usuário pressiona uma combinação específica de botões físicos. A API não detecta capturas de tela que são feitas com comandos de teste relacionados a elas, incluindo testes com o adb ou testes de instrumentação que capturam o conteúdo atual da tela do dispositivo.

Etapas de implementação

Para adicionar a detecção de capturas de tela, declare a nova permissão de instalação DETECT_SCREEN_CAPTURE:

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

Em seguida, conclua estas etapas para cada atividade no app em que os usuários podem fazer capturas de tela:

  1. Implemente um callback substituindo a função onScreenCapture(). Nesse callback, seu app pode realizar ações, como avisar outro usuário de que alguém fez uma captura de tela de uma conversa por mensagens.

    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. No método onStart() da atividade, registre o callback da captura de tela.

    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. No método onStop() da atividade, cancele o registro do callback da captura de tela:

    Kotlin

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

    Java

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

Controlar a capacidade de fazer capturas de tela

Se você não quiser que o conteúdo da atividade de um app apareça em capturas de tela ou em telas não seguras, defina a flag de exibição FLAG_SECURE.

Kotlin

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

Java

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