답변:
시도 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
. 나머지는 까다로워집니다. 자세한 내용은 이 블로그 게시물 을 참조하십시오 .
FLAG_SECURE
처음부터 존재했습니다. 최근까지만 의미가 제한되었습니다.
FLAG_SECURE
이라면, 너무 낮은 레벨이기 때문에이를 방어하지 못할 것입니다. 당신이 당신의 자신의 위젯 계층 구조를했고 그것이 그릴이 있다면 마찬가지로, Bitmap
-backed Canvas
, FLAG_SECURE
아마 당신이 당신의 자신의 위젯의 자신의 스크린 샷을 복용 한, 그 방어 때문에 아마도되지 않습니다 싶어 거기에 "안전한"사람을. 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 메소드를 재정의하고 뒷면의 모든 것을 포함하는 뷰를 표시하도록 뷰를 수정합니다.