Android:自定义最近的应用缩略图(默认情况下为屏幕截图)

时间:2017-04-07 09:15:35

标签: java android

我正在处理的应用程序显示了一些敏感信息,当按下主页按钮停止应用程序时,这些信息不能显示在“近期任务”屏幕上。

我想模糊屏幕截图中的敏感数据,或显示应用徽标

我知道以下方法,但它们不符合我的要求:

然后我尝试了一些解决方法但是没有按预期工作:

  • 开始一个新活动,在onPause中显示应用徽标,以便显示屏幕截图,而不是实际的活动屏幕截图。但新活动需要很长时间才能打开,这会破坏用户体验。
  • 将活动的内容视图设置为onPause中应用徽标的图像。这对我来说似乎是一个很好的解决方案。不幸的是,最近任务屏幕的屏幕截图是在未指定的时间进行的。在测试期间,在按下“主页”时,应用程序徽标会在应用程序关闭之前快速显示,但生成的屏幕截图会在此之前的短时间内显示该活动。
  • 从小部件中删除敏感数据(例如textView.setText(""))与上面提到的屏幕截图时序问题相同。

列出的解决方法的任何其他想法或解决方案?

5 个答案:

答案 0 :(得分:29)

几个月前我和你一样研究了这个目的。

不幸的是,我必须得出结论,这根本不可能。我挖掘了android源代码并确认了它。

  • 没有来自android的回调或方法允许你自定义它(无论如何都有效)。除了FLAG_SECURE之外,这部分代码不接受任何输入或更改。
  • OnPause和类似的生命周期方法被调用太晚了(截图已经被截取)。所有会暗示您即将进入后台的生命周期方法运行得太晚。
  • 您在最近的任务中看到的图像是一个实际的屏幕截图 - 因此不受您对视图所做的更改(太晚)的影响。这意味着您无法及时修改视图(例如将其隐藏,替换为其他内容,添加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之前,您需要onCreatesetContentView的活动中包含敏感数据。然后,您需要一个空的活动,该活动将呈现您想要的任何内容作为自定义缩略图。这通常是某种启动画面。此新活动必须是启动器,并且是唯一的活动,而不是FLAG_SECURE。启动此活动,然后在onResume中使用敏感数据启动您的实际活动。

Android操作系统将在您的应用程序开头截取该新活动的屏幕截图。不幸的是,用户还将在短时间内看到此活动。由于其他所有活动都是FLAG_SECURE,因此Android操作系统将使用开始时制作的唯一可用屏幕截图。

答案 3 :(得分:0)

当前(2020年10月28日)无法在最近使用的应用程序屏幕中自定义应用程序缩略图。
如@Dellkan在上一个答案中所述,操作系统不再调用onCreateThumbnail方法。

不幸的是,创建一种没有FLAG_SECURE 标志的启动器/启动屏幕的建议也让该应用对该活动进行截图的屏幕不起作用,因为屏幕截图是针对您看到的活动拍摄的,而不是针对应用启动时拍摄的。

根据报告here,您甚至不能使用FLAG_SECURE自定义窗口背景的颜色。

答案 4 :(得分:-2)

我认为这只能通过BroadCastReceiver实现,但不存在接收器。因此,首先禁用Android中的默认屏幕截图功能,然后实现自己的功能以获取屏幕截图,在截屏之前,您应该模糊您的安全信息。