防止 Android 应用内截图

很多时候,用户需要在我们的应用中输入类似于身份证号、密码、银行卡号等敏感信息,此时如果在后台不怀好意的应用程序对这些敏感页面进行截图,将导致用户的个人信息泄露。
Android 为我们提供了一种可以防止 Activity 被截图的方案来保护用户的隐私。

setContentView 前向窗口添加一个 FLAG_SECUREFLAG

0x00 代码

1
2
3
4
5
6
7
8
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
setContentView(R.layout.main);
}
}

0x01 实机测试

无法通过物理组合键截图

无法使用开发工具截图

通过 Shell 强行截图成功 但输出的截图文件除 StatusBar 含有不规则的像素外几乎为全透明

0x02 结语

Android使用 FLAG_SECURE 限制了 SurfaceFlinger 的功能,也用它将图形缓存区标记为不可截图,从而一定程度上的保证了屏幕区域的安全,正常开发的情况下推荐使用。

当然,如果你的用户安装了 Xposed 框架,别费尽心思了。Forget it~ :D