[Android] 인앱 캡처는 허용하고 멀티태스크 화면 캡처는 허용하지 않는 방법

불순분자들·2024년 4월 23일

Android

목록 보기
4/6
post-thumbnail

내가 원하는 조건은 인앱에서는 캡쳐가 가능하고, 백그라운드 및 멀티태스킹 전환 시 보안상의 이유로 화면을 노출하지 않도록 하는 것이었다.

FLAG_SECURE 를 사용한 코드

class MainActivity : AppCompatActivity() {
    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onResume() {
        window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
        super.onResume()
    }

    override fun onPause() {
        window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
        super.onPause()
    }
}
  • 위와 같이 코드를 작성하면 갤럭시 S8에서는 멀티태스킹 전환 시, 캡쳐가 불가능하며 화면이 흰색 배경으로 가려지게 되었다
  • 하지만, Pexel 4 와 갤럭시 Z flip 에서는 정상적인 동작을 하지 않는 문제가 있었다.
    • 문제: onResume() 내부의 코드는 정상작동 하였으나 onPause() 의 setFlags 가 인앱으로 돌아오기 전까지 동작하지 않았음.

시도한 해결 방법들

  1. Corutine 사용하기
  2. WorkManager OnetimeWorkRequest 사용하기
  3. setFlags ⭢ addFlags 로 교체해보기
  4. registerActivityLifecycleCallbacks 에 등록해서 호출해보기
  5. dialog 를 사용해서 화면 덮어보기
  6. frameLayout 을 사용해서 화면 가려보기
  7. Window Manager 사용해서 화면 가려보기

해결한 방법

안드로이드 API 33 부터 Activity 에 추가된 setRecentsScreenshotEnabled() 메서드를 사용했다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            setRecentsScreenshotEnabled(false)
        } else {
            window.setFlags(
                WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE
            )
        }
    }
}

setRecentsScreenshotEnabled(false) 로 설정하게 되면 Recent Screen( 최근 화면 )을 스크린 샷 할 수 없는 상태가 된다.

  • 기본적인 설정값은 true 이며, FLAG_SECURE 와 비교하면 setRecentScreenShot 은 Activity 가 활동 상태가 아닐 때 동작에 영향을 미친다.
  • 시스템은 활동 상태가 아닐때 스크린샷을 허용한다.

profile
장래희망 : 침대 위 녹아든 치즈

0개의 댓글