如何防止用户截取含安全数据的Glance App Widget屏幕截图?
Glance App Widget 防截屏解决方案
一、整个Widget禁止截屏
Android中App Widget运行在Launcher进程,无法直接像应用内Activity那样设置FLAG_SECURE,但Glance提供了官方方法实现全局防截屏:
- 在你的
GlanceAppWidget子类中,通过setSecureContentEnabled(true)配置安全会话,系统会通知Launcher将该Widget标记为安全内容,禁止截屏和录屏。
class SecureGlanceWidget : GlanceAppWidget() { override fun onCreateGlanceSession(context: Context): GlanceSession { return super.onCreateGlanceSession(context).apply { setSecureContentEnabled(true) } } override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { // 你的Widget布局 Box(modifier = Modifier.fillMaxSize()) { Text("此区域禁止截屏") } } } }
注意:该效果依赖Launcher的兼容性,主流Launcher(如Pixel Launcher、三星One UI Launcher)均支持,但部分小众Launcher可能无效果。
二、仅部分区域禁止截屏
目前Android系统没有原生支持Widget内局部区域防截屏的API,因为Widget视图是整体绘制到Launcher画布的。可以通过以下方式折中处理:
- 对敏感区域默认做模糊处理,仅在用户触发特定交互(如长按Widget进入临时授权状态)时显示清晰内容,降低被截屏的概率。
- 将敏感内容设计为动态短暂显示,比如仅在用户点击后显示几秒随即隐藏,减少截屏窗口。
三、Widget内安全图片防截屏问题
应用内你可能通过FLAG_SECURE或ImageView.setSecure(true)实现图片防截屏,但Widget运行在Launcher进程,这些方法不生效。可以这样解决:
- 给整个Widget开启
setSecureContentEnabled(true),让包括图片在内的所有内容都无法被截屏。 - 若不想全局禁用,可将敏感图片加密存储,在Widget绘制时动态解密为Bitmap显示,同时配合模糊处理,即使被截屏也只能得到不可读的内容(此方法会增加性能开销,且无法完全杜绝截屏)。
内容的提问来源于stack exchange,提问作者rafeef
相关产品推荐
相关产品推荐

