본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Android][kotlin] 안드로이드 캡처방지 (FLAG_SECURE)

by MinChan-Youn 2022. 2. 17.

안드로이드 앱 개발하는 과정에서 캡처방지 하는 방법에 대해서 알아보겠습니다.

코드는 간단하고 다음과 같습니다.

 

* 캡처방지

window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)

 

* 캡처방지 해제

window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)

 

 

----------------------------------------------------------------------------------------------------------

추가적으로 WindowManager.LayoutParams 속성에 대해서 알압보겠습니다.

전부 다 알아볼 수는 없지만 몇개 예시에 대해서 알아보도록 하겠습니다.

//<LayoutParams의 속성의 종류>

//윈도우 뒤의 모든것을 흐리게 설정
FLAG_BLUR_BEHIND

//윈도우 뒤의 모든것을 어둡게 설정
FLAG_DIM_BEHIND

//윈도우 에서 키 입력 포커스를 갖지 않는다. 사용자가 키나 다른 버튼의 이벤트를 보낼수 없다. 어떤 포커스 윈도우 대신에 뒤에 남을 것
FLAG_NOT_FOCUSABLE

//윈도우는 터치 이벤트를 절대 받을수 없음
FLAG_NOT_TOUCHABLE

//윈도우가 포커스 될때 조차(FLAG_NOT_FOCUSABLE이 설정되지 않음) 윈도우 외부의 어떤 포인터 이벤트도 윈도우 뒤로 보내는것을 허용
FLAG_NOT_TOUCH_MODAL

//윈도우의 전체 화면 내에서, 경계(별명으로 상태표시줄) 주위의 장식을 무시
FLAG_LAYOUT_IN_SCREEN

//진동 설정
FLAG_DITHER

//사용자가 윈도우 표시되는 동안, 화면을 켜고 밝게 함
FLAG_KEEP_SCREEN_ON

//모든 화면 장식(상태표시줄 등)이 창이 표시 되는 동안 숨김
FLAG_FULLSCREEN

//FLAG_FULLSCREEN 과 화면 장식(상태표시줄 같은) 보여지는 것을 무시
FLAG_FORCE_NOT_FULLSCREEN

//사용자의 뺨이 화면에 닫는 등의 이벤트를 감지 하지 않기 원할때 필터 설정
FLAG_IGNORE_CHEEK_PRESSES

 

자주 사용되는 속성 WindowManager.LayoutParams 종류는 위와 같습니다.

필요한 부분은 따로 체크해두어 나중에 개발할 때 사용하면 되겠습니다.

 

 

 

 

* 전체코드

MainActivity.kt

//MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.tbSecure.setOnCheckedChangeListener { buttonView, isChecked ->
            if(isChecked){
                SecureWindow(true)
            }else{
                SecureWindow(false)
            }
        }
    }

    /** 캡처방지(Android) 설정&해제 */
    fun SecureWindow(bool: Boolean){
        if(bool){
            window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
        }else{
            window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
        }
    }
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- activity_main.xml -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_secrue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="캡처방지 버튼"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ToggleButton
        android:id="@+id/tb_secure"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_secrue" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

build.gralde(:app)에 viewBinding 설정

    buildFeatures {
        viewBinding true
    }

 

* 캡처방지코드 적용 전

* 캡처방지코드 적용 후