【发布时间】:2012-04-07 00:03:15
【问题描述】:
出于安全原因,我当前正在构建的应用程序要求应用程序必须阻止操作系统在应用程序被推入后台时截取该应用程序的屏幕截图。这样在应用之间切换时将无法看到最后一个活动屏幕。
我打算将此功能放在应用程序类的 onPause 方法中,但首先我需要了解如何实现此功能。
那么有没有人知道如何解决这个问题?
【问题讨论】:
标签: android security android-lifecycle
出于安全原因,我当前正在构建的应用程序要求应用程序必须阻止操作系统在应用程序被推入后台时截取该应用程序的屏幕截图。这样在应用之间切换时将无法看到最后一个活动屏幕。
我打算将此功能放在应用程序类的 onPause 方法中,但首先我需要了解如何实现此功能。
那么有没有人知道如何解决这个问题?
【问题讨论】:
标签: android security android-lifecycle
如果有人正在寻找一种解决方案,当应用程序是所有正在运行的应用程序的背景或棒时,应用程序必须保护 (屏幕覆盖),并且应用内应用程序应该允许屏幕截图。 试试下面:-
@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);
}
【讨论】:
addFlags() 而不是setFlags(),这样更方便。
在每个活动的 setContentView 之前将这些行添加到 onCreate 之后,这对我有用。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);
【讨论】:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
这对我有用,它可以防止屏幕截图以及任何内置或第三方录制应用程序录制屏幕。
【讨论】:
这是一个隐藏应用程序内容的解决方案,当应用程序进入后台时,它会用启动屏幕覆盖它。这不是使用 FLAG_SECURE 技术,我只是覆盖屏幕的 onPause 和 onResume 方法,并修改视图以显示覆盖所有内容的视图。
【讨论】:
试试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、操作栏溢出等——都是不安全的。您可以通过调用getWindow() 并设置FLAG_SECURE 来修复Dialog 问题。其余的......变得棘手。请参阅this blog post 了解更多信息。
【讨论】:
FLAG_SECURE 从一开始就存在——直到最近才有意义。
FLAG_SECURE 不会对此进行辩护,因为这太低了-等级。同样,如果您采用自己的小部件层次结构并将其绘制到Bitmap-支持的Canvas,FLAG_SECURE 可能不会对此进行防御,因为您正在拍摄自己的小部件的屏幕截图,因此大概 想要那里的“安全”。 FLAG_SECURE 用于系统屏幕截图,例如最近的任务缩略图。
小心使用 WindowManager.LayoutParams.FLAG_SECURE,在某些设备上(在三星 Galaxy ACE 上验证,例如 GT-S5830)这会使视图混乱。看起来像三星特定的错误。我推荐以下:
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
这是乱码屏幕的样子:
这在 ICS 三星手机上可以正常工作,所以我假设问题与 Gingerbread 设备(或更旧的设备)无关。
【讨论】:
CommonsWare 提供的解决方案在 Lollipop 中仍然有效。
请注意,如果您想继续不查看整个应用程序的最近列表中的快照,所有已实现的活动都应在onCreate() 方法中指定旗帜getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
之前setContentView();
否则,如果用户浏览它,最近列表中的快照将显示不带标志的第一个活动。
【讨论】: