防止安卓应用程序被屏幕截图

16

我想知道是否有一种方法可以通过一些“onXXXXX”回调方法或接收的广播来检测其他进程是否即将对我的应用程序显示屏截图。例如,如果SDK工具或其他屏幕捕获应用程序执行了“屏幕截图”,我想得到通知,然后决定是否允许或拒绝屏幕截图。

如果这不可能,是否有一种方法可以锁定显示屏,以便其他进程无法屏幕截图我的显示屏?

2个回答

25

这对我在三星Tab 2 7"上的设备有效。

使用以下方法,将简单地向窗口标志添加FLAG_SECURE

public class FlagSecureTestActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

    setContentView(R.layout.main);
  }
}

有一个警告,可能需要更改

LayoutParams

WindowManager.LayoutParams

1
这个可行,应该是大多数开发者的答案。 - John Pang
2
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); 在安卓9.0上不起作用。 - Rajeev Sahu

7

在Android上,没有受支持的方法可以截取另一个应用程序的屏幕截图。唯一的方法是使用root权限或SDK,这两种方式都几乎不能阻止或接收通知。如果另一个应用程序截取了您的屏幕截图,则默认情况下它正在使用不受支持的方法,可能可以随意使用。

我想澄清的是,我并不是在暗示您不应该使用任何可用的方法来保护您的应用程序。我只是想让您知道,即使使用这些方法,您也可能无法100%安全地防止截屏。


实际上,在官方源代码中已经有此类功能的开端,并且非root应用程序可以在多个供应商设备上使用它。 - Chris Stratton
然而,只有在API文档中出现的内容才是官方的。我只是想说,因为目前任何截屏的方法都不受支持或直接来自SDK,所以很可能没有官方的与之交互的方法。 - jakebasile
View.getDrawingCache(boolean autoScale) 这个怎么样?文档上说:返回此视图绘制被缓存的位图。 - iDroid
1
@Chris Stratton -- Jake的回答非常到位;原帖作者想了解官方安全机制。 - cdhabecker
@cdhabecker - 问题中没有限制使用官方保护手段;实际上,问题在于要对抗官方和非官方的屏幕截图手段(“或其他屏幕捕捉应用程序”),这使得问题没有真正的解决方案。 - Chris Stratton
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接