Android에서 화면 캡처를 방지하는 방법


118

Android 애플리케이션에서 화면 녹화를 방지 할 수 있습니까?

Android 보안 애플리케이션을 개발하고 싶습니다. 그 점에서 배경을 실행하는 화면 녹화 소프트웨어를 감지하고 죽일 필요가 있습니다. 스크린 샷을 방지하기 위해 SECURE FLAG을 사용했습니다. 그러나 Android 화면의 비디오 캡처를 방지 할 수도 있습니다. 화면 캡처 (동영상 / 스크린 샷)를 방지하는 방법을 알려주세요.


8
-콘텐츠를 훔치기 위해 항상 화면에 카메라를 가리킬 수 있음을 기억해야합니다.-DRM 분야에서 사용되는 몇 가지 기술이 있지만 꽤 복잡하고 내부에서 무슨 일이 벌어지고 있는지 잘 모르겠습니다.
Shai Levy

9
@ShaiLevy가 설명하는 개념은 일반적으로 Analog Hole en.wikipedia.org/wiki/Analog_hole 이라고 불리며 미디어 전송의 불가피한 보안 구멍을 설명합니다.
gusridd

답변:


126

지원되는 수단을 통해 안드로이드 앱의 화면 / 동영상 캡처를 완전히 막을 없다고 말씀 드리고자합니다. 그러나 일반 안드로이드 기기 에서만 차단하고 싶다면 SECURE FLAG가 상당합니다.

1) 보안 플래그는 일반 스크린 샷과 비디오 캡처를 모두 차단합니다.

또한 이 링크의 문서에 따르면

창 플래그 : 창의 콘텐츠를 안전한 것으로 취급하여 스크린 샷에 표시되거나 비보안 디스플레이에 표시되지 않도록합니다.

위의 솔루션은 응용 프로그램이 앱의 비디오를 캡처하는 것을 확실히 방지합니다.

여기 에서 답변을 참조 하십시오 .

2) 화면 내용을 캡처하는 다른 방법이 있습니다.

루팅 된 기기에서 또는 SDK를 사용하여 다른 앱의 화면을 캡처 할 수 있습니다.

둘 다 차단하거나 알림을받을 가능성이 거의 또는 전혀 없습니다.

예 : SDK를 통해 휴대폰 화면을 컴퓨터로 미러링하는 소프트웨어가 있으므로 앱에서 검색 할 수없는 화면 캡처 소프트웨어를 그곳에서 사용할 수 있습니다.

여기 에서 답변을 참조 하십시오 .

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

11
또는 핸드 헬드 카메라로 간단히 이미지를 클릭 할 수 있습니다.
Ravinder Payal 2016 년

68

다음 줄을 추가하십시오.

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

setContentView()방법 전에 .


11
질문 : [quote] SECURE FLAG를 사용했습니다 [unquote] 귀하의 "답변": [quote] FLAG_SECURE를 사용할 수 있습니다 [unqote] 여기서 문제를 발견 할 수 있습니까?
2Dee

안녕하세요, 저는 웹 기반 포털 애플리케이션을 개발 중입니다. 사용자는 모든 종류의 브라우저를 사용하여이 포털에 접근 할 수 있습니다. 이 포털의 사용자는 모바일 장치를 사용할 때 스크린 샷을 찍으면 안됩니다. 웹 애플리케이션에 대해 동일한 예방 조치 (etWindow (). setFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);)를 사용할 수 있습니까? IOS에서 작동합니까? 동일한 유형의 예방 조치를 사용할 수 있다면 어디로 전화해야합니까?
Ferda-Ozdemir-Sonmez

24

화면 캡처를 비활성화하려면 :

onCreate()메서드에 다음 코드 줄을 추가합니다 .

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

화면 캡처를 활성화하려면 :

LayoutParams.FLAG_SECURE코드 줄을 찾아 제거합니다.


12

Java 사용자의 경우이 줄을 setContentView(R.layout.activity_main);

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

Kotlin 사용자의 경우

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

kotlin의 경우 컨텍스트에 따라 window?.set...Dialogs에서는 Window가 있을지 알지 못하기 때문입니다.
Martin Marconcini

1
원래 질문은 이미 보안 플래그를 사용했다고 말했으며 대답은 보안 플래그를 사용하는 것입니다. 이것은 실제로 게시 된 질문에 대한 답변이 아닙니다.
Subaru Tashiro

10

앱에서 스크린 샷을 비활성화하는 방법을 알고있는 것으로 보이며 이에 도움이되는 다른 답변이 있습니다. 하지만 아무도 제공하지 않는 중요한 정보 를 제공하려고 노력할 것입니다.

1) 스크린 샷 (사진 / 동영상) 촬영이 100 % 안전한 앱사용할 수 없습니다 . Android에서 스크린 샷을 찍는 공식적인 방법없습니다 . 앱이 화면을 녹화하는 경우 지원되지 않는 방법 (루팅 또는 SDK 사용)을 사용해야합니다 .

녹화 화면에 루트 액세스를 사용하는 경우 앱을 차단할 수있는 범위가 거의 없습니다.

2) 여기에서이 문제에 대해 언급 한 사람은 없지만 WindowManager.LayoutParams.FLAG_SECURE. 많은 장치 (예 : Samsung Galaxy ACE, 예 : GT-S5830)에서 전체보기가 뒤죽박죽임을 확인했습니다. 이렇게

여기에 이미지 설명 입력

이렇게 수표를 넣어주세요

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

ICS 장치에서 완벽하게 작동하므로 문제가 없습니다.

3) 또한 Android 4.3과 같은 최신 장치에서도 화면이 회전 할 때 애니메이션 문제가 발생한다는 것을 알게되었습니다. 제발 확인 이 버그 보고서를.


28
투표를 위해 다른 사람들의 답변을 복사하여 붙여 넣으면 안됩니다. 또한 답변을 복사 한 위치에 대한 참조를 추가하십시오. stackoverflow.com/a/11121897/5437621
mrid

귀하의 답변은 복사 및 붙여 넣기입니다. 다른 사람의 답변을 복사하여 붙여 넣지 마십시오. 아래 링크 언급 에서이 답변을 복사했습니다. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

앱을 기기 / 프로필 소유자로 만들고 setScreenCaptureDisabled(). 로부터 문서 ,이 API는 다음을 수행합니다

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) API 레벨 21에 추가됨

화면 캡처 비활성화 여부를 설정하기 위해 장치 / 프로필 소유자가 호출합니다. 화면 캡처를 비활성화하면 보안 비디오 출력이없는 디스플레이 장치에 콘텐츠가 표시되지 않습니다. 보안 표면 및 보안 디스플레이에 대한 자세한 내용은 FLAG_SECURE를 참조하십시오.

호출 장치 관리자는 장치 또는 프로필 소유자 여야합니다. 그렇지 않은 경우 보안 예외가 발생합니다. 매개 변수 admin이 요청이 연관된 DeviceAdminReceiver입니다. disabled 화면 캡처의 사용 여부입니다.

또는 MDM (Mobile Device Management) 파트너 앱 이 될 수 있습니다 .OEMs는 장치 를 제어하기 위해 MDM 파트너 앱에 추가 API를 제공합니다.

현재 이것은 화면 캡처 제한을 적용 할 수있는 유일한 방법입니다.


9

이 시도:

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

3
질문 : [quote] SECURE FLAG를 사용했습니다 [unquote] 귀하의 "답변": [quote] FLAG_SECURE를 사용할 수 있습니다 [unqote] 여기서 문제를 발견 할 수 있습니까?
2Dee

창 플래그 : 창의 콘텐츠를 안전한 것으로 취급하여 스크린 샷에 표시되거나 비보안 디스플레이에 표시되지 않도록합니다. 보안 표면 및 보안 디스플레이에 대한 자세한 내용은 FLAG_SECURE를 참조하십시오. 상수 값 : 8192 (0x00002000) 여기에서 더 읽기 developer.android.com/reference/android/view/…
Jithu PS

개선 사항을 롤백하여 게시물을 훼손하지 마십시오
FelixSFD

8

단일 활동에만 적합한 모든 답변을 보았지만 활동에 코드를 추가하지 않고 모든 활동에 대한 스크린 샷을 차단하는 솔루션이 있습니다. 먼저 Custom Application 클래스를 만들고 registerActivityLifecycleCallbacks. 그런 다음 매니페스트에 등록하십시오.

MyApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

명백한

 <application
        android:name=".MyApplicationContext"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

모든 경우에 작동합니까?
gopalanrc

내 프로젝트를 시도한 다음 모든 활동에서 작동했습니다. @gopalanrc
Gk Mohammad Emon

2

이것에 따르면 공식 가이드WindowManager.LayoutParams.FLAG_SECURE 창 레이아웃에 추가 할 수 있으며 스크린 샷을 허용하지 않습니다.


2

이 솔루션을 사용하여 앱에서 수동 스냅 샷을 허용하고 앱이 백그라운드로 전환 될 때 화면 캡처를 허용하지 않았으므로 도움이되기를 바랍니다.

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}

0

사진 스크린 샷 정보, FLAG_SECURE가 루팅 된 기기에서 작동하지 않습니다.

하지만 스크린 샷 파일을 모니터링하면 원본 파일 가져 오기를 방지 할 수 있습니다.

이 시도 하나 .

1. 안드로이드 원격 서비스로 스크린 샷 (파일 모니터) 모니터링
2. 원본 스크린 샷 이미지 삭제.
3. 수정할 수 있도록 비트 맵 인스턴스를 전달합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.