Android: Anpassen der letzten Apps-Miniaturansicht (Screenshot standardmäßig)

27

Die App, an der ich gerade arbeite, zeigt einige vertrauliche Informationen, die auf dem Bildschirm "Letzte Aufgaben" nicht angezeigt werden dürfen, wenn die App durch Drücken der Home-Taste beendet wird.

Ich möchte die sensiblen Daten im Screenshot verwischen oder stattdessen das App-Logo anzeigen .

Ich kenne die folgenden Ansätze, aber sie passen nicht zu meinen Anforderungen:

  • Die Einstellung der android:excludeFromRecents der Aktivität im Manifest auf true verhindert, dass die App bei den letzten Aufgaben überhaupt angezeigt wird. Dies würde die Benutzererfahrung stören.
  • Die Verwendung von FLAG_SECURE führt zu einer leeren Karte auf dem Bildschirm mit den aktuellen Aufgaben. ( ​​How verhindere ich, dass Android einen Screenshot erstellt, wenn meine App in den Hintergrund wechselt? ) Ich mag den leeren Bildschirm nicht. Ich bleibe jedoch bei dieser Lösung, wenn es keine Umgehungslösung gibt.
  • Das Überschreiben von onCreateThumbnail scheint die ideale Lösung zu sein, funktioniert aber leider nicht, da es derzeit vom Betriebssystem nicht aufgerufen wird :( ( Ссылка )

Und dann gibt es einige Problemumgehungen, die ich ausprobiert habe, aber das hat nicht wie erhofft funktioniert:

  • Starten Sie eine neue Aktivität, die das App-Logo in onPause anzeigt, so dass der Screenshot anstelle der tatsächlichen Aktivität angezeigt wird. Aber die neue Aktivität dauert zu lange, um die Benutzererfahrung zu stören.
  • Legen Sie die Inhaltsansicht der Aktivität auf ein Bild des App-Logos in onPause fest. Das schien mir eine großartige Lösung zu sein. Leider wird der Screenshot für den letzten Aufgabenbildschirm zu einem nicht festgelegten Zeitpunkt erstellt. Während des Testens erscheint das App-Logo schnell, bevor die App geschlossen wird, wenn "Home" gedrückt wird, aber der resultierende Screenshot zeigt die Aktivität kurz davor.
  • Das Entfernen der sensiblen Daten aus den Widgets (z. B. textView.setText("") ) hat das gleiche Problem mit dem gerade erwähnten Timing des Screenshots.

Irgendwelche alternativen Ideen oder Lösungen zu den aufgelisteten Problemumgehungen?

    
xvlcw 07.04.2017, 09:15
quelle

4 Antworten

3

Ich habe das vor ein paar Monaten zum gleichen Zweck wie Sie untersucht.

Leider musste ich feststellen, dass dies einfach nicht möglich ist. Ich habe den Android-Quellcode durchforstet und es bestätigt.

  • Es gibt keine Callbacks oder Methoden von android, mit denen Sie es anpassen können (das funktioniert sowieso). Neben FLAG_SECURE akzeptiert dieser Teil des Codes keine Eingabe oder Änderung.
  • OnPause und ähnliche Lebenszyklusmethoden werden zu spät aufgerufen (der Screenshot ist bereits vergeben). Alle Lebenszyklusmethoden, die darauf hindeuten würden, dass Sie in den Hintergrund treten, werden zu spät ausgeführt.
  • Das Bild, das Sie in den letzten Aufgaben sehen, ist ein tatsächlicher Screenshot - und wird daher nicht von Änderungen beeinflusst, die Sie (zu spät) für Ihre Ansicht vornehmen. Das bedeutet, dass Sie Ihre Ansicht nicht just-in-time ändern können (z. B. indem Sie sie unsichtbar machen, durch etwas anderes ersetzen, SECURE_FLAG hinzufügen oder ein anderes Hindernis für die Ansicht). Nebenbei können diese Bilder auf einem Emulator bei /data/system_ce/0/recent_images gefunden werden.
  • Die einzige Ausnahme ist die Verwendung von FLAG_SECURE , wodurch verhindert wird, dass der Screenshot von Ihrer Anwendung aufgenommen wird. Ich habe versucht, diese FLAG in onPause zu setzen und sie in onResume zu entfernen, aber wie bereits erwähnt, laufen diese Lifecycle-Methoden, nachdem der Screenshot bereits erstellt wurde, und hatten somit absolut keine Wirkung.

Wie in beschrieben, wie Sie den angezeigten Snapshot ändern können nach der letzten App-Liste? war früher ein Callback, mit dem Sie das Thumbnail anpassen konnten: onCreateThumbnail . Dies funktioniert jedoch nicht und es wird nie aufgerufen. Um es klar zu sagen, der Callback ist immer noch da, er wird einfach nie vom Betriebssystem aufgerufen. Die Tatsache, dass es aufgehört hat zu arbeiten, ist schlecht dokumentiert, wurde aber offensichtlich in 4.0.3 stillgelegt / entfernt.

Was das Thumbnail selbst angeht, ist es ein Screenshot, der serverseitig aufgenommen wurde. Es wird genommen, bevor onPause aufgerufen wird (oder tatsächlich, bevor irgendwelche Rückrufe, die anzeigen, dass Ihre Aktivität im Begriff ist, in den Hintergrund zu treten, aufgerufen wird).

Wenn Ihre App in den Hintergrund tritt, wird Ihre aktuelle Ansicht animiert (um den Zoom-Out-Übergang zu erhalten). Diese Animation kann durch Änderungen in onPause beeinflusst werden (wenn du schnell genug bist) (Ich habe unter anderem damit experimentiert, die Deckkraft auf 0 zu setzen). Dies betrifft jedoch nur die Animation. Wenn die Animation beendet ist, wird die Ansicht durch den zuvor aufgenommenen Screenshot ersetzt.

Siehe auch diese Fragen, die dies diskutieren:

Dellkan 17.03.2018 18:11
quelle
0

Wie wäre es, ein Layout-Overlay über Ihrer gesamten Aktivität zu implementieren?

Machen Sie es transparent, es ist standardmäßig ein Click-through, also hat es keine negativen Auswirkungen auf UX während der Verwendung.

In onPause() wird ein halbtransparentes, unscharfes Bild als Hintergrund dieses Layouts festgelegt, die Daten werden dahinter verschlüsselt. In onResume() ändere den Hintergrund wieder vollständig transparent. Voila.

Es könnte schneller als andere Arten von Überlagerungen sein. Der positive Nebeneffekt ist, wenn Sie die Unschärfe als einen kurzen Animationseffekt machen, wenn der Benutzer zurückgeht ( mit einer richtigen Bibliothek, die C ++ statt Java verwendet), könnte es sogar cool aussehen und die Benutzer würden nicht sogar daran, es zu sehen.

Ich habe das selbst nicht versucht, aber es ist etwas, das du noch nicht ausprobiert hast.

    
Chapz 28.09.2017 14:44
quelle
0

Ich gebe die Antwort in Kotlin , wenn Sie Java verwenden, können Sie den Code einfach ändern. Was Sie brauchen, ist LifeCycleObserver , weil Activity's lifecycle methods false flags geben kann, da sie aufgerufen werden, wenn die Aktivitäten geändert werden (nicht nur die Home-Taste drücken)

Hier ist ein Listener für Hintergrundänderungen, der sich von LifecycleObserver

erstreckt %Vor%

Implementieren Sie es zu Ihrer Basisaktivität

%Vor%

hier der zweite Teil in Java:

%Vor%

Sie können den ersten Teil als kotlin-Klasse verwenden, wenn Sie es nicht tun, ist es immer noch ziemlich einfach, es in Java zu ändern.

Sie benötigen die folgenden Abhängigkeiten:

%Vor%

In diesem Fall sollte sich Ihre Basisaktivität von AppCompatActivity erstrecken und alle anderen Aktivitäten sollten von dieser Basisaktivität ausgehen.

Durch Überschreiben der Vordergrund / Hintergrund-Änderungsmethoden können Sie das ui entsprechend manipulieren.

Ich rate Ihnen, das Logo Ihrer App zu sehen, das zu Ihrem Layout passt. Ein Layout, das Ihr gesamtes Layout abdeckt, aber die Sichtbarkeit verloren ist, aber seine Sichtbarkeit auf View.GONE . Setzen Sie ihn dann in den Beobachtermethoden auf View.VISIBLE , damit Sie diese Ansicht für den Benutzer anzeigen können, wenn die App zu "app switcher"

wechselt     
Ege Kuzubasioglu 20.03.2018 11:14
quelle
-2

Ich denke, das kann nur durch BroadCastReceiver erreicht werden, aber es ist kein Empfänger vorhanden. Deshalb deaktivierst du zuerst die Standard-Screenshot-Funktion in Android und implementierst dann deine eigene Funktionalität, um Screenshots zu machen und bevor du Screenshots machst, solltest du deine sicheren Informationen verwischen.

    
Arsalan Khan 03.10.2017 07:34
quelle

Tags und Links