【问题标题】:Android: Customizing recent apps thumbnail (screenshot by default)Android:自定义最近的应用程序缩略图(默认截图)
【发布时间】:2017-09-02 14:41:22
【问题描述】:

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

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

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

然后,我尝试了一些解决方法,但效果不如预期:

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

对于列出的变通办法有任何替代想法或解决方案吗?

【问题讨论】:

  • @Ωmega 如果适合您的用户体验,请尝试使用android:autoRemoveFromRecents
  • @PravinDivraniya - 如果应用程序通过按 Recents Apps 按钮从该活动进入后台,那么该标志将不起作用。系统仍会显示缩略图。只有当您按下 Home 按钮然后转到 Recents App 列表时,它才会像预期的那样出现。很奇怪,对吧?
  • @Ωmega 是的,这是非常奇怪的行为。
  • @Ωmega 据我说,FLAG_SECURE 是您最好的选择,但您还应该在 onPause/onStop 中更改活动的视图(可能使用您提到的应用程序的徽标),因为有些设备显示屏幕截图即使在使用 FLAG_SECURE
  • @SarthakMittal - 不幸的是,onPause / onStop 被触发/调用太晚了,因此在这些点所做的任何更改都不会更改 Recents 中的应用程序缩略图.

标签: java android


【解决方案1】:

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

使其透明,默认为点击,因此在使用时不会对用户体验产生负面影响。

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

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

我自己没有尝试过,但你还没有尝试过。

【讨论】:

  • 太棒了,这是一个简单而干净的“解决方法”,因为没有官方解决方案,我创建了一个带有一些透明背景的线性布局和一个带有覆盖屏幕的徽标的图像视图并应用了更改使用 onPause() 和 onResume()。
  • 这不是解决方案,因为屏幕截图是在 onPause 之前在意外时间截取的
【解决方案2】:

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

【讨论】:

  • 何时实施上述方案,然后我也会根据意见更新我的答案。
【解决方案3】:

几个月前,我出于与您相同的目的调查了此问题。

不幸的是,我不得不得出结论,这根本不可能。我翻遍了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)什么触发系统制作屏幕截图? (2) 系统使用什么功能来截屏?我们可以覆盖一些用于制作和保存屏幕截图的函数吗? (3) 能否找到系统获取截图并保存的那一行源码?
【解决方案4】:

有一种方法可以自定义它。在setContentView 之前,您需要将带有敏感数据的活动发送到onCreate 中的FLAG_SECURE。然后,您需要一个空的 Activity,它将您想要的任何内容呈现为自定义缩略图。这通常是某种闪屏。这个新的 Activity 需要是启动器,并且是唯一不是 FLAG_SECURE 的 Activity。此 Activity 已启动,并在 onResume 中使用敏感数据启动您的实际 Activity。

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

【讨论】:

    【解决方案5】:

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

    不幸的是,创建一种不带 FLAG_SECURE 标志的启动器/启动屏幕以让应用截取该活动的屏幕截图的建议不起作用,因为屏幕截图是在您看到的活动上截取的,而不是在应用启动时截取的。

    不能在使用 FLAG_SECURE 时甚至自定义窗口背景的颜色,如报告 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多