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

2022-08-31 14:14:50

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

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

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

然后我尝试了一些解决方法,但这并没有像希望的那样起作用:

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

列出的解决方法是否有任何替代想法或解决方案?


答案 1

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

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

  • 没有来自android的回调或方法允许您自定义它(无论如何都有效)。此外,这部分代码不接受任何输入或更改。FLAG_SECURE
  • OnPause和类似的生命周期方法调用得太晚了(屏幕截图已经拍摄)。所有暗示您将进入后台的生命周期方法都运行得太晚了。
  • 您在最近的任务中看到的图像是实际的屏幕截图 - 因此不受您对视图所做的更改(为时已晚)的影响。这意味着您无法及时修改视图(例如使其不可见,用其他内容替换,添加 ,或视图的任何其他障碍)。顺便说一句,这些图像可以在模拟器上找到。SECURE_FLAG/data/system_ce/0/recent_images
  • 唯一的例外是 using ,这将阻止截取应用程序的屏幕截图。我尝试设置了这个FLAG并将其删除,但是如前所述,这些生命周期方法已经在屏幕截图之后运行,因此绝对没有效果。FLAG_SECUREonPauseonResume

如何更改最近使用的应用列表显示的快照?中所述?曾经有一个可用于自定义缩略图的回调:onCreateThumbnail。但是,这不起作用,并且永远不会被调用。需要明确的是,回调仍然存在,它只是从未作系统调用过。它停止工作的事实记录得很差,但显然在4.0.3中被默默弃用/删除了

至于缩略图本身,它是服务器端拍摄的屏幕截图。它是在被调用之前(或者实际上在调用任何指示您的活动即将进入后台的回调之前)被调用。onPause

当你的应用进入后台时,你的实际视图将以动画形式显示(以获得缩小过渡)。该动画可以通过您在其中进行的更改(如果您足够快的话)来影响(我尝试在窗口中将不透明度设置为0等)。但是,这只会影响动画。动画完成后,视图将替换为之前拍摄的屏幕截图。onPause

另请参阅讨论此问题的以下问题:


答案 2

如何在整个活动之上实现布局叠加?

使其透明,默认情况下它是点击的,因此在使用时不会对UX产生负面影响。

在设置一个半透明的模糊图像作为该布局的背景时,数据将被打乱在其后面。在将背景更改为完全透明再次。瞧。onPause()onResume()

它可能比其他类型的叠加更快。积极的副作用是,如果你在用户返回时将模糊的动画效果作为简短的动画效果(使用使用C++而不是Java的适当库),它甚至可能看起来很酷,用户甚至不介意看到它。

我自己还没有尝试过,但这是你还没有尝试过的东西。


推荐