我目前正在构建的应用程序要求应用程序必须防止操作系统在出于安全原因将应用程序推到后台时对应用程序进行截图。这样,在应用程序之间切换时,它将无法看到最后一个活动屏幕。我计划将此功能放在应用程序类的oncode.js方法中,但首先我需要了解如何实现此功能。所以有没有人在那里,有一个线索如何解决这个问题?
erhoui1w1#
试试FLAG_SECURE:
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的应用程序)。
更新:它还可以防止Android 6.0上的Now On Tap或其他助手;如果用户打开助手,他们将无法访问UI中的小部件和容器的详细信息。更新#2:不过,并非所有活动都受到保障。任何弹出窗口-Dialog、Spinner、AutoCompleteTextView、操作栏溢出等。- 不安全您可以通过调用getWindow()并设置FLAG_SECURE来修复Dialog问题。其它的...会很棘手this blog post更多
Dialog
Spinner
AutoCompleteTextView
getWindow()
jljoyd4f2#
在某些设备上使用WindowManager.LayoutParams.FLAG_SECURE时要小心(已在Samsung 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); }
这是一个scrambled screen的样子:
这是正常工作的ICS三星手机虽然,所以我假设问题是孤立的姜饼设备(或旧).
k10s72fa3#
CommonsWare提供的解决方案在Lollipop中仍然有效。只是一个注意,如果你想继续 * 不 * 看到快照在最近的列表中为 * 整个 * 应用程序,所有实现的活动应指定在onCreate()方法的标志getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);之前setContentView();否则,如果用户浏览了第一个Activity,则最近列表中的快照将显示第一个不带标记的Activity。
onCreate()
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
setContentView();
yizd12fk4#
如果有人正在寻找一个解决方案,其中应用程序必须安全 (屏幕覆盖) 当应用程序是所有运行的应用程序的背景或坚持和应用程序内的应用程序应该允许截图。试试下面:
@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); }
ny6fqffe5#
从Android 13开始,有一种新的方法可以防止对最近的应用列表进行屏幕截图,同时仍然允许用户在使用应用时进行屏幕截图。在您的主要活动中,调用setRecentsScreenshotEnabled(false)。
setRecentsScreenshotEnabled(false)
lf5gs5x26#
这里是一个隐藏应用程序的内容的解决方案,当应用程序被放入后台时,用闪屏覆盖它。这并没有使用FLAG_SECURE技术,我只是覆盖了屏幕的onResume和onResume方法,并修改了视图,以显示一个覆盖了后面所有内容的视图。https://stackoverflow.com/a/52976001/6686912
dsekswqp7#
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
这对我来说很有效,它可以防止截图,也可以防止任何内置或第三方录制应用程序录制屏幕。
xesrikrc8#
这是我在每个Activity的setContentView之前将这些行添加到onCreate之后的工作。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); setContentView(R.layout.activity_notification);
8条答案
按热度按时间erhoui1w1#
试试
FLAG_SECURE
:这绝对可以防止手动截图和ICS最近任务历史记录的自动截图。它还可以防止屏幕录制(例如,使用媒体投影API的应用程序)。
更新:它还可以防止Android 6.0上的Now On Tap或其他助手;如果用户打开助手,他们将无法访问UI中的小部件和容器的详细信息。
更新#2:不过,并非所有活动都受到保障。任何弹出窗口-
Dialog
、Spinner
、AutoCompleteTextView
、操作栏溢出等。- 不安全您可以通过调用getWindow()
并设置FLAG_SECURE
来修复Dialog
问题。其它的...会很棘手this blog post更多jljoyd4f2#
在某些设备上使用WindowManager.LayoutParams.FLAG_SECURE时要小心(已在Samsung Galaxy ACE上验证,例如GT-S5830)这将使视图混乱。看起来像一个三星特定的bug。我建议如下:
这是一个scrambled screen的样子:
这是正常工作的ICS三星手机虽然,所以我假设问题是孤立的姜饼设备(或旧).
k10s72fa3#
CommonsWare提供的解决方案在Lollipop中仍然有效。
只是一个注意,如果你想继续 * 不 * 看到快照在最近的列表中为 * 整个 * 应用程序,所有实现的活动应指定在
onCreate()
方法的标志getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
之前setContentView();
否则,如果用户浏览了第一个Activity,则最近列表中的快照将显示第一个不带标记的Activity。
yizd12fk4#
如果有人正在寻找一个解决方案,其中应用程序必须安全 (屏幕覆盖) 当应用程序是所有运行的应用程序的背景或坚持和应用程序内的应用程序应该允许截图。试试下面:
ny6fqffe5#
从Android 13开始,有一种新的方法可以防止对最近的应用列表进行屏幕截图,同时仍然允许用户在使用应用时进行屏幕截图。在您的主要活动中,调用
setRecentsScreenshotEnabled(false)
。lf5gs5x26#
这里是一个隐藏应用程序的内容的解决方案,当应用程序被放入后台时,用闪屏覆盖它。这并没有使用FLAG_SECURE技术,我只是覆盖了屏幕的onResume和onResume方法,并修改了视图,以显示一个覆盖了后面所有内容的视图。
https://stackoverflow.com/a/52976001/6686912
dsekswqp7#
这对我来说很有效,它可以防止截图,也可以防止任何内置或第三方录制应用程序录制屏幕。
xesrikrc8#
这是我在每个Activity的setContentView之前将这些行添加到onCreate之后的工作。