Détecter quand les utilisateurs prennent des captures d'écran de l'appareil

Le message "L'application Pay a détecté cette capture d'écran" s'affiche
Image 1. Exemple de toast fourni par le système qui s'affiche lorsque l'utilisateur prend une capture d'écran d'une application compatible avec l'API de détection de capture d'écran.

Pour créer une expérience plus standardisée, Android 14 introduit une API de détection des captures d'écran protégeant la confidentialité. Cette API permet aux applications d'enregistrer des rappels par activité. Ces rappels sont appelés, et l'utilisateur en est informé lorsqu'une capture d'écran est prise et que cette activité est visible.

Cas d'utilisation compatibles

Dans Android 14, l'API système ne détecte une capture d'écran que si l'utilisateur effectue une combinaison spécifique sur les boutons physiques. L'API ne détecte pas les captures d'écran effectuées lors de l'exécution de commandes de test liées aux captures d'écran, y compris ADB, ou dans les tests d'instrumentation qui capturent les contenus actuels de l'écran de l'appareil.

Procédure d'implémentation

Pour ajouter la détection de captures d'écran, déclarez la nouvelle autorisation au moment de l'installation, DETECT_SCREEN_CAPTURE :

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

Ensuite, procédez comme suit pour chaque activité de votre application dans lesquelles les utilisateurs peuvent effectuer des captures d'écran :

  1. Implémentez un rappel en remplaçant la fonction onScreenCapture(). Dans ce rappel, votre application peut prendre des mesures, par exemple avertir un autre utilisateur que quelqu'un a pris une capture d'écran d'une conversation par messages.

    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. Dans la méthode onStart() de l'activité, enregistrez le rappel de la capture d'écran.

    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. Dans la méthode onStop() de l'activité, annulez l'enregistrement du rappel de capture d'écran:

    Kotlin

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

    Java

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

Contrôler la possibilité de faire des captures d'écran

Si vous ne souhaitez pas que le contenu de l'activité d'une application apparaisse sur des captures d'écran ou sur des écrans non sécurisés, définissez l'indicateur d'affichage FLAG_SECURE.

Kotlin

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

Java

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