我正在处理的应用程序显示了一些敏感信息,当按下主页按钮停止应用程序时,这些信息不能显示在“近期任务”屏幕上。
我想模糊屏幕截图中的敏感数据,或显示应用徽标。
我知道以下方法,但它们不符合我的要求:
android:excludeFromRecents
设置为true会阻止应用程序在最近的任务中完全显示。这会破坏用户体验。FLAG_SECURE
会在最近任务屏幕上显示空白卡片。 (How do I prevent Android taking a screenshot when my app goes to the background?)我不喜欢空白屏幕。但是,如果没有解决方法,我会坚持使用此解决方案。onCreateThumbnail
似乎是理想的解决方案,但不幸的是,它不起作用,因为它目前没有被操作系统调用:((https://code.google.com/p/android/issues/detail?id=29370)然后我尝试了一些解决方法但是没有按预期工作:
onPause
中显示应用徽标,以便显示屏幕截图,而不是实际的活动屏幕截图。但新活动需要很长时间才能打开,这会破坏用户体验。onPause
中应用徽标的图像。这对我来说似乎是一个很好的解决方案。不幸的是,最近任务屏幕的屏幕截图是在未指定的时间进行的。在测试期间,在按下“主页”时,应用程序徽标会在应用程序关闭之前快速显示,但生成的屏幕截图会在此之前的短时间内显示该活动。textView.setText("")
)与上面提到的屏幕截图时序问题相同。列出的解决方法的任何其他想法或解决方案?
答案 0 :(得分:29)
几个月前我和你一样研究了这个目的。
不幸的是,我必须得出结论,这根本不可能。我挖掘了android源代码并确认了它。
FLAG_SECURE
之外,这部分代码不接受任何输入或更改。SECURE_FLAG
或视图的任何其他障碍)。另外,这些图像可以在/data/system_ce/0/recent_images
的仿真器上找到。 FLAG_SECURE
,这会阻止截取您的应用程序的屏幕截图。我尝试在onPause
中设置此FLAG并在onResume
中将其删除,但是如上所述,这些生命周期方法已经在截屏后已经运行,因此完全没有效果。正如How to change the snapshot shown by recent apps list?中所讨论的,曾经有一个可用于自定义缩略图的回调:onCreateThumbnail。但是,这不起作用,永远不会被调用。要清楚的是,回调仍然存在,它根本就不会被操作系统调用。它停止工作的事实记录很少,但显然在4.0.3中被默默地弃用/删除
对于缩略图本身,它是服务器端的截图。它是在调用onPause
之前进行的(或实际上在任何回调之前,表示您的活动即将进入后台)。
当您的应用进入后台时,您的实际视图会动画化(以进行缩小转换)。通过onPause
中的更改,动画可以受到影响(如果你足够快)(我尝试在窗口中将不透明度设置为0等)。但这只会影响动画。动画完成后,视图将被之前拍摄的屏幕截图所取代。
另见这些问题:
答案 1 :(得分:0)
如何在整个活动的基础上实施布局叠加层?
使其透明,默认情况下是点击,因此在使用时不会对用户体验产生负面影响。
在onPause()
中设置半透明,模糊的图像作为该布局的背景,数据将在其后面加扰。在onResume()
中,将背景更改为完全透明。瞧。
它可能比其他类型的叠加更快。积极的副作用是,如果你在用户返回时使用简短的动画效果进行简单的动画效果(使用适当的库使用C ++而不是Java ),它甚至可能看起来很酷并且用户不会即便看到它。
我自己没有尝试过,但这是你还没有尝试过的东西。
答案 2 :(得分:0)
有一种自定义方法。在FLAG_SECURE
之前,您需要onCreate
中setContentView
的活动中包含敏感数据。然后,您需要一个空的活动,该活动将呈现您想要的任何内容作为自定义缩略图。这通常是某种启动画面。此新活动必须是启动器,并且是唯一的活动,而不是FLAG_SECURE
。启动此活动,然后在onResume中使用敏感数据启动您的实际活动。
Android操作系统将在您的应用程序开头截取该新活动的屏幕截图。不幸的是,用户还将在短时间内看到此活动。由于其他所有活动都是FLAG_SECURE
,因此Android操作系统将使用开始时制作的唯一可用屏幕截图。
答案 3 :(得分:0)
当前(2020年10月28日)无法在最近使用的应用程序屏幕中自定义应用程序缩略图。
如@Dellkan在上一个答案中所述,操作系统不再调用onCreateThumbnail
方法。
不幸的是,创建一种没有FLAG_SECURE 标志的启动器/启动屏幕的建议也让该应用对该活动进行截图的屏幕不起作用,因为屏幕截图是针对您看到的活动拍摄的,而不是针对应用启动时拍摄的。
根据报告here,您甚至不能使用FLAG_SECURE自定义窗口背景的颜色。
答案 4 :(得分:-2)
我认为这只能通过BroadCastReceiver实现,但不存在接收器。因此,首先禁用Android中的默认屏幕截图功能,然后实现自己的功能以获取屏幕截图,在截屏之前,您应该模糊您的安全信息。