[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);