如何防止Android在我的应用进入后台时截图?

ve7v8dk2  于 2023-10-14  发布在  Android
关注(0)|答案(8)|浏览(142)

我目前正在构建的应用程序要求应用程序必须防止操作系统在出于安全原因将应用程序推到后台时对应用程序进行截图。这样,在应用程序之间切换时,它将无法看到最后一个活动屏幕。
我计划将此功能放在应用程序类的oncode.js方法中,但首先我需要了解如何实现此功能。
所以有没有人在那里,有一个线索如何解决这个问题?

erhoui1w

erhoui1w1#

试试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:不过,并非所有活动都受到保障。任何弹出窗口-DialogSpinnerAutoCompleteTextView、操作栏溢出等。- 不安全您可以通过调用getWindow()并设置FLAG_SECURE来修复Dialog问题。其它的...会很棘手this blog post更多

jljoyd4f

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三星手机虽然,所以我假设问题是孤立的姜饼设备(或旧).

k10s72fa

k10s72fa3#

CommonsWare提供的解决方案在Lollipop中仍然有效。
只是一个注意,如果你想继续 * 不 * 看到快照在最近的列表中为 * 整个 * 应用程序,所有实现的活动应指定在onCreate()方法的标志getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);之前setContentView();
否则,如果用户浏览了第一个Activity,则最近列表中的快照将显示第一个不带标记的Activity。

yizd12fk

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);
    }
ny6fqffe

ny6fqffe5#

从Android 13开始,有一种新的方法可以防止对最近的应用列表进行屏幕截图,同时仍然允许用户在使用应用时进行屏幕截图。在您的主要活动中,调用setRecentsScreenshotEnabled(false)

lf5gs5x2

lf5gs5x26#

这里是一个隐藏应用程序的内容的解决方案,当应用程序被放入后台时,用闪屏覆盖它。这并没有使用FLAG_SECURE技术,我只是覆盖了屏幕的onResume和onResume方法,并修改了视图,以显示一个覆盖了后面所有内容的视图。
https://stackoverflow.com/a/52976001/6686912

dsekswqp

dsekswqp7#

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

这对我来说很有效,它可以防止截图,也可以防止任何内置或第三方录制应用程序录制屏幕。

xesrikrc

xesrikrc8#

这是我在每个Activity的setContentView之前将这些行添加到onCreate之后的工作。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,     
WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.activity_notification);

相关问题