Wykrywanie, kiedy użytkownicy robią zrzuty ekranu na urządzeniu

Komunikat „Aplikacja Pay wykryła ten zrzut ekranu”
Rysunek 1. Przykład komunikatu systemowego, który pojawia się, gdy użytkownik zrobi zrzut ekranu aplikacji obsługującej interfejs Screenshot Detection API.

Aby zapewnić bardziej standardowe wykrywanie zrzutów ekranu, Android 14 wprowadza interfejs API do wykrywania zrzutów ekranu z zachowaniem prywatności. Ten interfejs API umożliwia aplikacjom rejestrowanie wywołań zwrotnych dla poszczególnych aktywności. Te wywołania zwrotne są wywoływane, a użytkownik jest powiadamiany, gdy zrobi zrzut ekranu podczas wyświetlania tego działania.

Obsługiwane przypadki użycia

W Androidzie 14 interfejs API systemu wykrywa zrzut ekranu tylko wtedy, gdy użytkownik naciśnie określoną kombinację przycisków sprzętowych. Interfejs API nie wykrywa zrzutów ekranu wykonanych podczas uruchamiania poleceń testowych związanych ze zrzutami ekranu, w tym ADB, ani w ramach testów instrumentacyjnych, które rejestrują bieżącą zawartość ekranu urządzenia.

Etapy wdrażania

Aby dodać wykrywanie zrzutów ekranu, zadeklaruj nowe uprawnienie DETECT_SCREEN_CAPTURE przyznawane podczas instalacji:

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

Następnie wykonaj te czynności w przypadku każdej aktywności w aplikacji, w której użytkownicy mogą robić zrzuty ekranu:

  1. Zaimplementuj wywołanie zwrotne, zastępując funkcję onScreenCapture(). W tym wywołaniu zwrotnym aplikacja może podjąć działanie, np. ostrzec innego użytkownika, że ktoś zrobił zrzut ekranu rozmowy.

    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. W metodzie onStart() aktywności zarejestruj wywołanie zwrotne zrzutu ekranu.

    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. W metodzie onStop() aktywności wyrejestruj wywołanie zwrotne zrzutu ekranu:

    Kotlin

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

    Java

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

Kontrolowanie możliwości robienia zrzutów ekranu

Jeśli nie chcesz, aby zawartość aktywności aplikacji pojawiała się na zrzutach ekranu lub na wyświetlaczach niezabezpieczonych, ustaw flagę wyświetlania FLAG_SECURE.

Kotlin

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

Java

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