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

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

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

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



답변

시도 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. 나머지는 까다로워집니다. 자세한 내용은 이 블로그 게시물 을 참조하십시오 .


답변

일부 장치 (예 : 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 장치 (또는 그 이상)에 문제가 있다고 가정합니다.


답변

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

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

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


답변

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

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


답변

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

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


답변

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

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);


답변