Android 14에서 스크린샷 감지하는 방법
Android 14의 변경사항으로, 스크린샷을 찍을 때 감지하는 API를 제공하고 있습니다.
스크린샷 감지는 사용자의 Privacy 보호를 위해 사용될 수 있습니다. 어떤 그룹 채팅 방에서 누군가 채팅 화면에 대해서 스크린샷을 찍었을 때, 앱은 이것을 감지하고 채팅방에 있는 다른 사용자에게 누군가 대화 내용을 스크린샷으로 저장했다고 알릴 수 있습니다.
1. API 기능 및 제한 사항
Android 14에서 제공하는 스크린샷 감지 API는 사용자가 하드웨어 버튼 등으로 스크린샷을 캡처하는 경우에만 감지합니다. ADB 등으로 스크린샷을 저장할 때는 감지하지 않습니다.
앱은 callback을 등록할 수 있고, 스크린샷이 감지되면 callback을 통해 이벤트가 전달됩니다.
2. API 사용 및 스크린샷 감지 방법
API를 사용하려면 DETECT_SCREEN_CAPTURE
권한이 필요하며, 다음과 같이 AndroidManifest에 선언을 해야 합니다. 이 권한은 install permission으로 normal protection level 속성을 갖고 있습니다. 즉, 앱을 설치하면 즉시 앱에 권한이 부여됩니다.
<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
스크린샷 콜백 등록
코드에서는 registerScreenCaptureCallback()
으로 스크린 캡쳐가 될 때 callback으로 이벤트를 받을 수 있습니다.
screenCaptureCallback
은 스크린 캡쳐가 되었을 때, 이 함수가 호출되면서 이벤트가 전달됩니다.- 아래 예제는 액티비티의
onStart()
에서 스크린 캡쳐 콜백을 등록하고 있습니다. - Executor는 Activity에서 기본적으로 제공하는 mainExecutor를 사용하며, 다른 Executor를 사용하고 싶다면 직접 생성하고 인자로 전달하면 됩니다.
val screenCaptureCallback = Activity.ScreenCaptureCallback {
Log.d("MainActivity", "Screen captured!")
}
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)
}
스크린샷 콜백 해제
액티비티가 종료될 때, unregisterScreenCaptureCallback()
로 등록한 콜백을 해제해야 합니다. 이후에 액티비티가 다시 실행될 때, registerScreenCaptureCallback()
로 등록하여 이벤트를 수신할 수 있습니다.
override fun onStop() {
super.onStop()
unregisterScreenCaptureCallback(screenCaptureCallback)
}
3. 내 앱 화면 캡처 방지
내 앱의 화면이 스크린 캡처에 찍히지 않도록 하려면 아래와 같이, FLAG_SECURE
플래그를 윈도우에 추가하면 됩니다.
- setFlags() 또는 addFlags()로 플래그 추가
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)
캡처 방지를 해제하려면 윈도우에서 FLAG_SECURE
플래그를 제거하면 됩니다.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE)