当我的应用程序进入后台时,如何防止Android截图?
我目前正在构建的应用程序要求,出于安全原因,当应用程序被推到后台时,应用程序必须防止操作系统截图。这样,在应用程序之间切换时,它将无法看到最后一个活动屏幕 我计划将此功能放在应用程序类的onPause方法中,但首先我需要了解如何实现此功能 有没有人知道如何解决这个问题 试试看: 这绝对可以防止ICS最近任务历史记录中的手动屏幕截图和自动屏幕截图。它还可以防止屏幕录制(例如,使用媒体投影API的应用程序) 更新:它还可以保护安卓6.0上的Now-On-Tap或其他助手;如果用户打开助手,他们将无法访问UI中小部件和容器的详细信息当我的应用程序进入后台时,如何防止Android截图?,android,security,android-lifecycle,Android,Security,Android Lifecycle,我目前正在构建的应用程序要求,出于安全原因,当应用程序被推到后台时,应用程序必须防止操作系统截图。这样,在应用程序之间切换时,它将无法看到最后一个活动屏幕 我计划将此功能放在应用程序类的onPause方法中,但首先我需要了解如何实现此功能 有没有人知道如何解决这个问题 试试看: 这绝对可以防止ICS最近任务历史记录中的手动屏幕截图和自动屏幕截图。它还可以防止屏幕录制(例如,使用媒体投影API的应用程序) 更新:它还可以保护安卓6.0上的Now-On-Tap或其他助手;如果用户打开助手,他们将无法
更新#2:但是,并非活动中的所有内容都将受到保护。任何弹出窗口-
对话框
、微调器
、自动完成文本视图
、操作栏溢出等都将不安全。您可以通过调用对话框上的getWindow()
并设置FLAG\u SECURE
来解决对话框的问题。其余的。。。变得棘手。有关更多信息,请参阅。在某些设备上使用WindowManager.LayoutParams.FLAG_SECURE时要小心(已在三星Galaxy ACE上验证,例如GT-S5830),这会使视图混乱。看起来像是三星特有的bug。我建议如下:
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
这就是加扰屏幕的外观:
不过,这在ICS三星手机上运行正常,所以我假设问题与姜饼设备(或更早的设备)无关。Commonware提供的解决方案在棒棒糖中仍然有效
请注意,如果您想继续在整个应用程序的最近列表中看不到快照,所有已实施的活动都应该在onCreate()
方法中指定标志getWindow().addFlags(WindowManager.LayoutParams.flag\u SECURE)代码>
在setContentView()之前代码>
否则,如果用户浏览,最近列表中的快照将显示第一个不带标志的活动。以下是一个解决方案,用于隐藏应用程序的内容,方法是在将应用程序置于后台时,用启动屏幕覆盖应用程序。这不是使用FLAG_SECURE技术,我只是覆盖屏幕的onPause和onResume方法,并修改视图以显示一个覆盖后面所有内容的视图
这对我来说是可行的,它可以防止截图以及任何内置或第三方录制应用程序录制屏幕。将这些行添加到每个活动的onCreate before setContentView中后,这对我来说是可行的
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);
如果有人正在寻找一个解决方案,当应用程序是所有正在运行的应用程序的背景或粘贴时,应用程序必须安全(屏幕覆盖),并且应用程序内应用程序应允许屏幕截图。
请尝试以下内容:-
@Override
protected void onResume() {
super.onResume();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
@Override
protected void onPause() {
super.onResume();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
@丹妮:事实上,这和问题有关。我刚刚在NexusS(4.0.3)上测试了它,它的工作原理与预期一样——最近的任务截图被抑制了。您仍然可以看到应用程序名称和图标,但屏幕截图是黑色的。欢迎您在ICS硬件上试用。@StingRay5:FLAG_SECURE
从一开始就存在——直到最近它的意义还很有限。有趣的是,在活动生命周期中有一个名为onCreate的方法,但从未使用过。@PankajKumar:您编写的是经典的“将帧缓冲区作为根抓取”技巧,FLAG\u SECURE
不会对此进行防御,因为这太低级了。类似地,如果您采用自己的小部件层次结构,并将其绘制到位图背景画布,标记安全可能不会对此进行辩护,因为您正在拍摄自己小部件的屏幕截图,因此可能需要其中的“安全”小部件FLAG_SECURE
用于系统屏幕截图,如最近的任务缩略图。精彩而简单的答案!我想知道为什么像这样的应用程序不使用它来阻止某人截取发送的图像。你完全正确,我们遇到了这个问题,当然需要检查API级别。实际上忘了发这封信了,谢谢你再提出来。:)它也出现在三星Gio(姜饼)上,但在Froyo上没有问题——所以它只出现在2.3上,我们也注意到了这个问题。您可以在Gingerbread设备上的模拟器中进行验证。我还可以确认此问题出现在三星Gingerbread设备上。即使在较新的Android版本上,FLAG_SECURE也可能存在问题:在Android 4.3上,FLAG_SECURE会导致屏幕旋转动画中的动画问题,请参阅-这已在我的应用程序中的Android 4.4上修复,我具有根据用户偏好设置/清除标志_安全的功能。它工作良好,直到KITKAT和黑屏可以在任务切换中看到。在棒棒糖中,概览显示了我的应用程序的最后一个快照,即未设置(清除)安全标志的时间。@r.bhardwaj我认为在这种情况下我们不能做太多,但您可以建议用户,更改需要重新启动应用程序才能完全生效;-)你们完成了。有人在拍摄快照之前找到了一种膨胀自定义视图的方法,这样它就不仅仅是一个黑屏了吗?我试着在onPause中在窗口管理器上扩展视图,但似乎已经太晚了。嗨@user1064249,你找到解决方案了吗?在操作系统截图之前,我想放大Launcher视图
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);
@Override
protected void onResume() {
super.onResume();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
@Override
protected void onPause() {
super.onResume();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}