앱이 백그라운드로 이동할 때 Android에서 스크린 샷을 찍지 않도록하려면 어떻게합니까?


146

현재 구축중인 앱에는 보안상의 이유로 백그라운드로 푸시 될 때 OS가 앱의 스크린 샷을 찍지 않도록 앱이 요구해야합니다. 이렇게하면 앱간에 전환 할 때 마지막 활성 화면을 볼 수 없습니다.

이 기능을 응용 프로그램 클래스의 onPause 메서드에 넣을 계획이지만 먼저이 기능을 달성 할 수있는 방법을 찾아야합니다.

그래서이 문제를 해결하는 단서가있는 사람이 있습니까?

답변:


264

시도 FLAG_SECURE:

public class FlagSecureTestActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

    setContentView(R.layout.main);
  }
}

이는 ICS 최근 작업 기록의 수동 스크린 샷과 자동 스크린 샷으로부터 확실히 보호됩니다. 또한 화면 녹화 (예 : 미디어 프로젝션 API를 사용하는 앱)로부터 보호합니다.

업데이트 : Now On Tap 또는 Android 6.0의 다른 보조자로부터 보호합니다. 사용자가 길잡이를 불러 오면 UI의 위젯 및 컨테이너 세부 사항에 액세스 할 수 없습니다.

업데이트 # 2 : 그러나 활동의 모든 것이 보호되는 것은 아닙니다. 모든 팝업 창 - Dialog, Spinner, AutoCompleteTextView, 작업 표시 줄의 오버 플로우 등 - 안전하지 않은 것입니다. Dialog전화 getWindow()를 걸어 설정 하여 문제를 해결할 수 있습니다 FLAG_SECURE. 나머지는 까다로워집니다. 자세한 내용은 이 블로그 게시물 을 참조하십시오 .


6
@ 대니 : 실제로, 그것은 질문과 관련이 있습니다. 방금 Nexus S (4.0.3)에서 테스트했으며 예상대로 작동합니다. 최근 작업 스크린 샷이 표시되지 않습니다. 여전히 응용 프로그램 이름과 아이콘이 표시되지만 스크린 샷은 검은 색입니다. ICS 하드웨어에서 사용해 볼 수 있습니다.
CommonsWare

2
@ StingRay5 : FLAG_SECURE처음부터 존재했습니다. 최근까지만 의미가 제한되었습니다.
CommonsWare

1
활동 라이프 사이클에 onCreateThumbnail이라는 메소드가 있지만 사용되지는 않습니다.
Snicolas

2
@PankajKumar : 만약 당신이 작성한 "스크린 샷을 찍는 코드"가 고전적인 "프레임 버퍼를 루트로 잡는"트릭 FLAG_SECURE이라면, 너무 낮은 레벨이기 때문에이를 방어하지 못할 것입니다. 당신이 당신의 자신의 위젯 계층 구조를했고 그것이 그릴이 있다면 마찬가지로, Bitmap-backed Canvas, FLAG_SECURE아마 당신이 당신의 자신의 위젯의 자신의 스크린 샷을 복용 한, 그 방어 때문에 아마도되지 않습니다 싶어 거기에 "안전한"사람을. FLAG_SECURE을위한 시스템 등 최근-작업 축소판으로 스크린 샷.
CommonsWare

2
훌륭하고 간단한 답변! snapchat 과 같은 앱이 왜 누군가가 전송 된 이미지의 스크린 샷을 찍지 못하게하기 위해 이것을 사용하지 않는지 궁금 합니다.
Shobhit Puri

78

일부 장치 (예 : Samsung Galaxy ACE (예 : GT-S5830)에서 확인)에서 WindowManager.LayoutParams.FLAG_SECURE 사용에주의를 기울이면 뷰가 스크램블됩니다. 삼성 관련 버그 인 것 같습니다. 다음을 권장합니다.

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

스크램블 된 화면은 다음과 같습니다.

스크램블 화면 이미지

이것은 ICS Samsung 전화에서 제대로 작동하므로 Gingerbread 장치 (또는 그 이상)에 문제가 있다고 가정합니다.


8
당신은 완전히 옳았습니다. 우리는이 문제를 겪었고 API 수준을 확인해야했습니다. 실제로 이것을 게시하는 것을 잊었으므로 다시 가져 주셔서 감사합니다. :)
StingRay5

또한 삼성 지오 (진저 브레드)하지만 프로 요에서의 확인에서 발생 - 그것은 단지 2.3에서 발생하므로
픽셀

우리도이 문제를 발견했습니다. 진저 브레드 장치의 에뮬레이터에서 확인할 수 있습니다.
twaddington

이 문제가 Samsung Gingerbread 장치에 나타나는지 확인할 수도 있습니다.
Ernir Erlingsson

7
최신 Android 버전에서도 FLAG_SECURE에 문제가있을 수 있습니다. Android 4.3에서 FLAG_SECURE는 화면 회전 애니메이션에서 애니메이션 문제를 발생시킵니다 ( code.google.com/p/android/issues/detail?id=58632 참조)-Android 4.4에서 수정되었습니다
Oliver

13

CommonsWare가 제공하는 솔루션은 Lollipop에서도 계속 유효합니다.

참고로, 전체 앱에 대한 최근 목록에서 스냅 샷 을 계속 표시 하지 않으 려면 구현 된 모든 활동이 메소드에서 플래그 를 지정해야합니다.onCreate()getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);setContentView();

그렇지 않으면 최근 목록의 스냅 샷에 사용자가 탐색 한 경우 플래그없이 첫 번째 활동이 표시됩니다.


1
내 앱에는 사용자 기본 설정에 따라 FLAG_SECURE를 설정 / 삭제하는 기능이 있습니다. KITKAT과 작업 전환기에서 검은 화면이 보일 때까지 잘 작동했습니다. Lollipop에서 Overview는 FLAG_SECURE가 설정되지 않은 시간 인 내 앱의 마지막 스냅 샷을 표시합니다.
r.bhardwaj

@ r.bhardwaj 나는 우리가 그 경우에 그렇게 많은 것을 할 수 없다고 생각하지만, 당신은 사용자에게 조언을 할 수 있습니다. 완전히 적용하려면;
Davideas

1
스냅 샷을 만들기 전에 사용자 정의보기를 부풀려 검은 화면이 아닌 사람이 있습니까? onPause의 창 관리자에서보기를 팽창 시키려고했지만 너무 늦었습니다.
user1064249

안녕하세요 @ user1064249 해결책을 찾았습니까? OS가 스크린 샷을 찍기 전에 런처 뷰를 팽창시키고 싶습니다
Alexiscanny

1

다음은 앱을 백그라운드에 놓을 때 시작 화면으로 덮어서 앱의 콘텐츠를 숨기는 솔루션입니다. 이것은 FLAG_SECURE 기술을 사용하지 않고 단순히 화면의 onPause 및 onResume 메소드를 재정의하고 뒷면의 모든 것을 포함하는 뷰를 표시하도록 뷰를 수정합니다.

https://stackoverflow.com/a/52976001/6686912


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

이것은 나를 위해 일했습니다. 스크린 샷 및 내장 또는 타사 레코딩 응용 프로그램을 레코딩 화면에서 가져 가지 못하게합니다.


0

이것은 모든 활동의 setContentView 전에 onCreate 에이 줄을 추가 한 후에 나에게 효과적입니다.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,     
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.