当我的应用程序进入后台时,如何防止 Android 截屏?

我目前正在开发的应用程序要求,出于安全原因,当应用程序被推到后台时,应用程序必须防止操作系统截屏。这样在应用程序之间切换时,它就不能看到最后一个活动屏幕。

我计划将这个功能放在应用程序类的 onPuse 方法中,但是首先我需要了解如何实现这个功能。

有人知道怎么解决这个问题吗?

108099 次浏览

试试 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 : 然而,并非活动中的所有内容都会受到保护。任何弹出窗口 DialogSpinnerAutoCompleteTextView,操作栏溢出等将是不安全的。您可以通过调用 getWindow()并设置 FLAG_SECURE来修复 Dialog问题。剩下的... 就棘手了。有关更多信息,请参见 这篇博文

小心使用 WindowManager。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);
}

这就是加密屏幕的样子:

Scrambled Screen Image

这是正常工作的 ICS 三星手机虽然,所以我假设问题是孤立的姜饼设备(或更老)。

CommonsWare 提供的解决方案在棒棒糖中仍然有效。

请注意,如果您想继续到 没有查看 完整的应用程序最近列表中的快照,所有实现的活动都应该在 onCreate()方法中指定标志 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);setContentView();之前

否则,如果用户浏览了最近列表中的快照,该快照将显示第一个没有标志的活动。

这里有一个隐藏应用程序内容的解决方案,当应用程序被放入后台时,用一个闪屏覆盖它。这并没有使用 FLAG _ SECURE 技术,我只是覆盖了屏幕的 onPuse 和 onResume 方法,并修改了视图,以显示一个覆盖后面所有内容的视图。

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

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

这为我工作,它防止采取屏幕截图,也任何内置或第三方记录应用程序从记录屏幕。

在将这些代码行添加到每个活动的 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.onPause();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

在 Android 13中,有一种新的方法可以防止最近的应用程序列表截屏,同时仍然允许用户在使用应用程序时截屏: https://developer.android.com/reference/android/app/Activity#setRecentsScreenshotEnabled(boolean)