【问题标题】:How do I prevent Android taking a screenshot when my app goes to the background?当我的应用程序进入后台时,如何防止 Android 截屏?
【发布时间】:2012-04-07 00:03:15
【问题描述】:

出于安全原因,我当前正在构建的应用程序要求应用程序必须阻止操作系统在应用程序被推入后台时截取该应用程序的屏幕截图。这样在应用之间切换时将无法看到最后一个活动屏幕。

我打算将此功能放在应用程序类的 onPause 方法中,但首先我需要了解如何实现此功能。

那么有没有人知道如何解决这个问题?

【问题讨论】:

    标签: android security android-lifecycle


    【解决方案1】:

    如果有人正在寻找一种解决方案,当应用程序是所有正在运行的应用程序的背景或棒时,应用程序必须保护 (屏幕覆盖),并且应用内应用程序应该允许屏幕截图。 试试下面:-

    @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(),这样更方便。
    【解决方案2】:

    在每个活动的 setContentView 之前将这些行添加到 onCreate 之后,这对我有用。

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

    【讨论】:

      【解决方案3】:
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                  WindowManager.LayoutParams.FLAG_SECURE);
      

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

      【讨论】:

        【解决方案4】:

        这是一个隐藏应用程序内容的解决方案,当应用程序进入后台时,它会用启动屏幕覆盖它。这不是使用 FLAG_SECURE 技术,我只是覆盖屏幕的 onPause 和 onResume 方法,并修改视图以显示覆盖所有内容的视图。

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

        【讨论】:

          【解决方案5】:

          试试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 问题。其余的......变得棘手。请参阅this blog post 了解更多信息。

          【讨论】:

          • @Dany's:实际上,它与问题有关。我刚刚在 Nexus S (4.0.3) 上对其进行了测试,它按预期工作——最近的任务屏幕截图被抑制了。您仍然可以看到应用程序名称和图标,但屏幕截图是黑色的。欢迎您在 ICS 硬件上试用。
          • @StingRay5: FLAG_SECURE 从一开始就存在——直到最近才有意义。
          • 有趣的是,在活动生命周期中有一个名为 onCreateThumbnail 的方法,但从未使用过。
          • @PankajKumar:如果您编写的“截屏代码”是经典的“以 root 身份获取帧缓冲区”技巧,FLAG_SECURE 不会对此进行辩护,因为这太低了-等级。同样,如果您采用自己的小部件层次结构并将其绘制到Bitmap-支持的CanvasFLAG_SECURE 可能不会对此进行防御,因为您正在拍摄自己的小部件的屏幕截图,因此大概 想要那里的“安全”。 FLAG_SECURE 用于系统屏幕截图,例如最近的任务缩略图。
          • 精彩而简单的答案!我想知道为什么像 snapchat 这样的应用不使用它来防止有人截取发送的图像。
          【解决方案6】:

          小心使用 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 设备(或更旧的设备)无关。

          【讨论】:

          • 你说得对,我们遇到了这个问题,当然需要检查 API 级别。其实忘记发这个了,谢谢你再次提出来。 :)
          • 它也出现在 Samsung Gio (Gingerbread) 但在 Froyo 上没问题 - 所以它只出现在 2.3 上
          • 我们也注意到了这个问题。您可以在 Gingerbread 设备上的模拟器中进行验证。
          • 我还可以确认这个问题出现在三星姜饼设备上。
          • 即使在较新的 Android 版本上,FLAG_SECURE 也可能存在问题:在 Android 4.3 上,FLAG_SECURE 会导致屏幕旋转动画出现动画问题,请参阅code.google.com/p/android/issues/detail?id=58632 - 这已在 Android 4.4 上得到修复
          【解决方案7】:

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

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

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

          【讨论】:

          • 在我的应用程序中,我具有根据用户偏好设置/清除 FLAG_SECURE 的功能。它工作正常,直到可以在任务切换器中看到 KITKAT 和黑屏。在 Lollipop 中,Overview 显示我的应用程序的最后一个快照,即未设置(清除)FLAG_SECURE 的时间。
          • @r.bhardwaj 我认为在这种情况下我们不能做太多事情,但是您可以建议用户,更改需要重新启动应用程序才能完全生效 ;-) 你是完成。
          • 有人找到了一种在拍摄快照之前为自定义视图充气的方法,因此它不仅仅是黑屏吗?我已经尝试在 onPause 中对窗口管理器的视图进行膨胀,但到那时似乎为时已晚。
          • 嗨@user1064249 你找到任何解决方案了吗?我想在操作系统截取屏幕截图之前为启动器视图充气
          猜你喜欢
          • 2012-01-28
          • 1970-01-01
          • 2015-08-01
          • 2014-12-13
          • 2011-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多