The app I'm working on shows some sensitive information that must not be shown on the "Recent Tasks" screen when stopping the app by pressing the home button.
I'd like to blur the sensitive data in the screenshot or show the app logo instead.
I am aware of the following approaches but they don't fit my requirements:
android:excludeFromRecents
to true in the manifiest prevents the app from being shown at all in the recent tasks. This would disrupt the user experience.FLAG_SECURE
results in a blank card on the recents tasks screen. (How do I prevent Android taking a screenshot when my app goes to the background?) I don't like the blank screen. However, I'll stick to this solution if there is no workaround.onCreateThumbnail
seems like the ideal solution but, unfortunately, doesn't work as it's currently not invoked by the OS :( (https://code.google.com/p/android/issues/detail?id=29370)And then there are some workarounds that I tried out but that didn't work as hoped:
onPause
so that it's screenshot is shown instead of the actual activitie's one. But the new activity takes too long to open and it disrupts the user experience.onPause
. That seemed like a great solution to me. Unfortunately, the screenshot for the recent tasks screen is taken at an unspecified time. During testing the app logo quickly appears before the app is closed when pressing 'Home' but the resulting screenshot shows the activity a short time before that.textView.setText("")
) has the same problem of screenshot timing just mentioned.Any alternative ideas or solutions to the listed workarounds?
From the Home screen, tap the Recents icon. Tap More options (the three vertical dots), and then tap Settings. Tap the switch next to Show recommended apps to turn on or off.
I looked into this a couple of months ago for the same purpose as you.
Unfortunately, I had to conclude that it is simply not possible. I dug through the android source code and confirmed it.
FLAG_SECURE
, this part of the code does not accept any input or change.SECURE_FLAG
, or any other obstruction of the view). As an aside, these images can be found on an emulator at /data/system_ce/0/recent_images
. FLAG_SECURE
, which will prevent the screenshot from being taken of your application. I experimented with setting this FLAG in onPause
and removing it in onResume
, however as mentioned already these lifecycle methods runs after the screenshot is taken already, and thus had absolutely no effect.As discussed in How to change the snapshot shown by recent apps list? there used to be a callback that you could use to customize the thumbnail: onCreateThumbnail. However, this does not work and it is never called. To be clear, the callback is still there, it is simply never called by the OS. The fact that it stopped working is poorly documented, but apparently was silently deprecated/removed in 4.0.3
As for the thumbnail itself, it is a screenshot taken serverside. It is taken before onPause
is called (or in fact before any callbacks indicating that your activity is about to go into the background is called).
When your app does go into the background, your actual view is animated (to get that zoom-out transition). That animation can be affected through changes you do in onPause
(if you're fast enough that is) (I experimented with setting opacity to 0 on the window among other things). This will however only affect the animation. When the animation is finished, the view is replaced by the screenshot taken earlier.
Also see these questions that discuss this:
How about implementing a layout overlay on top of your entire activity?
Make it transparent, it's click-through by default, so no negative impact on UX while in use.
In onPause()
set a half-transparent, blurred image as the background of that layout, the data will be scrambled behind it. In onResume()
change the background to fully transparent again. Voila.
It might be faster than other types of overlays. The positive side effect is, if you do the unblurring as a short animation effect when the user goes back (with a proper library that uses C++ instead of Java), it might even look cool and the users wouldnt even mind seeing it.
I haven't tried this myself, but it's something you haven't tried yet.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With