繁体   English   中英

Android:自定义最近的应用程序缩略图(默认截图)

[英]Android: Customizing recent apps thumbnail (screenshot by default)

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

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

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

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

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

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

几个月前,我出于与您相同的目的进行了调查。

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

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

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

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

当您的应用确实进入后台时,您的实际视图会被动画化(以获得缩小过渡)。 该动画可能会受到您在onPause中所做的更改的影响(如果您足够快的话)(我尝试在窗口上将不透明度设置为 0 等)。 然而,这只会影响动画。 动画完成后,视图将替换为之前截取的屏幕截图。

另请参阅讨论此问题的这些问题:

在整个活动之上实现布局覆盖如何?

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

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

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

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

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

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

当使用此处报告的 FLAG_SECURE 时,您甚至无法自定义窗口背景的颜色。

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

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

正在寻找解决方案并发现一些脏东西,以防您不想使用“FLAG_SECURE”。 它不会提供漂亮的图片,但可以保护数据,并且不会阻止用户在应用程序中时为他们制作屏幕截图。

protected void onPause () {
    this.getWindow().getDecorView().getRootView().setScaleX((float)200);
    this.getWindow().getDecorView().getRootView().setScaleY((float)200);
    super.onPause();
  }

  protected void onResume () {
    this.getWindow().getDecorView().getRootView().setScaleX((float)1);
    this.getWindow().getDecorView().getRootView().setScaleY((float)1);
    super.onResume();
  }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM