사용자가 기기 스크린샷을 찍을 때 감지

'Pay 앱에서 이 스크린샷을 감지함'이라는 메시지가 표시됨
그림 1. 사용자가 스크린샷 감지 API를 지원하는 앱의 스크린샷을 찍을 때 표시되는 시스템 제공 토스트 메시지 예시

스크린샷 감지를 위한 보다 표준화된 환경을 만들기 위해 Android 14에서는 개인 정보 보호 스크린샷 감지 API를 도입했습니다. 이 API를 사용하면 앱에서 활동별로 콜백을 등록할 수 있습니다. 활동이 표시되는 동안 사용자가 스크린샷을 찍으면 이러한 콜백이 호출되고 사용자에게 알림이 전송됩니다.

지원되는 사용 사례

Android 14에서 시스템 API는 사용자가 하드웨어 버튼을 특정 조합으로 누르는 경우에만 스크린샷을 감지합니다. 이 API는 ADB 등 스크린샷과 관련된 테스트 명령어를 실행할 때 또는 기기의 현재 화면 콘텐츠를 캡처하는 계측 테스트 내에서 찍은 스크린샷을 감지하지 않습니다.

구현 단계

스크린샷 감지를 추가하려면 새 DETECT_SCREEN_CAPTURE 설치 시간 권한을 선언합니다.

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

그런 다음 사용자가 스크린샷을 캡처할 수 있는 앱의 각 활동에 다음 단계를 완료합니다.

  1. onScreenCapture() 함수를 재정의하여 콜백을 구현합니다. 이 콜백에서는 앱이 다른 사용자에게 누군가 메시지 대화의 스크린샷을 촬영했음을 알리는 등의 조치를 취할 수 있습니다.

    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. 활동의 onStart() 메서드에서 스크린샷 콜백을 등록합니다.

    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. 활동의 onStop() 메서드에서 스크린샷 콜백을 등록 취소합니다.

    Kotlin

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

    Java

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

스크린샷 캡처 기능 제어

앱 활동의 콘텐츠가 스크린샷이나 비보안 디스플레이에 표시되지 않게 하려면 FLAG_SECURE 디스플레이 플래그를 설정하세요.

Kotlin

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

Java

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