Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 앱 스크린샷 캡처 방지 방법 – FLAG_SECURE로 화면 보호하기

금융 앱, 메신저, 인증 서비스처럼 민감한 정보를 다루는 애플리케이션에서는 사용자가 화면을 캡처하거나 최근 앱 목록에 화면 내용이 노출되는 것을 원치 않는 경우가 많습니다. 이 글에서는 안드로이드에서 FLAG_SECURE 윈도우 플래그를 사용해 앱 화면의 스크린샷 촬영과 녹화를 차단하는 방법을 단계별로 소개합니다.

FLAG_SECURE란 무엇인가?

WindowManager.LayoutParams.FLAG_SECURE는 해당 윈도우(액티비티)의 화면을 '보안 화면'으로 취급하도록 시스템에 알려주는 플래그입니다. 이 플래그가 설정되면 다음과 같은 효과가 있습니다.

  • 스크린샷 버튼을 눌러도 검은 화면만 저장됩니다.
  • 화면 녹화 시에도 해당 액티비티 영역은 빈 화면으로 기록됩니다.
  • 최근 앱(Recents) 화면에서 앱 미리보기가 가려집니다.

구현 단계

1단계 — 새 프로젝트 만들기

Android Studio에서 File → New Project를 선택하고 필요한 정보를 입력해 새 프로젝트를 생성합니다.

2단계 — 레이아웃 작성(res/layout/activity_main.xml)

아래와 같이 샘플용 TextView 하나가 있는 간단한 레이아웃을 구성합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/parent"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:gravity="center"
    android:orientation="vertical">
    <TextView
        android:id="@+id/openYoutube"
        android:text="Open youtube application"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

3단계 — MainActivity.java 코드 추가

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                WindowManager.LayoutParams.FLAG_SECURE);
        setContentView(R.layout.activity_main);
    }
}

핵심 코드 살펴보기

위 코드의 핵심은 onCreate()에서 setContentView()를 호출하기 전에 아래 한 줄을 추가하는 것입니다.

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

setFlags()에 같은 플래그를 두 번 전달하는 이유는, 첫 번째 매개변수가 설정할 플래그 값이고 두 번째 매개변수가 변경 대상이 되는 플래그 마스크이기 때문입니다. 즉, FLAG_SECURE 비트만 활성화하겠다는 의미입니다.

참고: 위 예제는 예전 Support Library(android.support.*)를 사용합니다. 최신 Android Studio 프로젝트라면 import 문을 androidx.appcompat.app.AppCompatActivity로 교체하세요. 또한 FLAG_SECURE는 API 1부터 제공되므로 별도의 버전 분기 처리 없이 어느 기기에서든 사용할 수 있습니다.

앱 실행 및 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 Android Studio 상단의 Run 버튼을 클릭하고, 대상 기기를 선택해 앱을 실행합니다. 앱이 시작되면 아래와 같은 기본 화면이 표시됩니다.

안드로이드 앱 스크린샷 캡처 방지 방법 – FLAG_SECURE로 화면 보호하기

이제 기기의 스크린샷 버튼(일반적으로 전원 + 볼륨 다운)을 눌러 캡처를 시도해 보세요. 캡처는 정상적으로 수행되지만, 갤러리에서 이미지를 열어보면 아래처럼 완전히 검은 화면만 저장된 것을 확인할 수 있습니다.

이처럼 FLAG_SECURE 플래그 한 줄만으로 결제 화면, 개인정보 페이지 등 민감한 화면을 손쉽게 보호할 수 있습니다. 다만 이 설정은 해당 액티비티 전체에 적용되므로, 실제 서비스에서는 필요한 화면에만 선택적으로 적용하는 것이 좋습니다.