java - samsung - Android: Personalización de miniaturas de aplicaciones recientes(captura de pantalla por defecto)
como hacer una captura de pantalla en el celular (4)
La aplicación en la que estoy trabajando muestra información confidencial que no debe mostrarse en la pantalla "Tareas recientes" al detener la aplicación presionando el botón de inicio.
Me gustaría difuminar los datos confidenciales en la captura de pantalla o mostrar el logotipo de la aplicación .
Soy consciente de los siguientes enfoques, pero no se ajustan a mis requisitos:
-
Configurar
android:excludeFromRecents
como verdadero en la variedad evita que la aplicación se muestre en las tareas recientes. Esto interrumpiría la experiencia del usuario. -
El uso de
FLAG_SECURE
daFLAG_SECURE
resultado una tarjeta en blanco en la pantalla de tareas recientes. ( ¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación pasa a segundo plano? ) No me gusta la pantalla en blanco. Sin embargo, me atendré a esta solución si no hay una solución alternativa. -
onCreateThumbnail
parece ser la solución ideal pero, desafortunadamente, no funciona, ya que actualmente el SO no lo invoca :( ( https://code.google.com/p/android/issues/detail?id=29370 )
Y luego hay algunas soluciones que probé pero que no funcionaron como esperaba:
-
Inicie una nueva actividad que muestre el logotipo de la aplicación en
onPause
para que se muestre su captura de pantalla en lugar de la de la actividad real. Pero la nueva actividad tarda demasiado en abrirse e interrumpe la experiencia del usuario. -
Establezca la vista de contenido de la actividad en una imagen del logotipo de la aplicación en
onPause
. Eso me pareció una gran solución. Desafortunadamente, la captura de pantalla para la pantalla de tareas recientes se toma en un momento no especificado. Durante la prueba, el logotipo de la aplicación aparece rápidamente antes de que la aplicación se cierre al presionar ''Inicio'', pero la captura de pantalla resultante muestra la actividad poco tiempo antes. -
Eliminar los datos confidenciales de los widgets (por ejemplo,
textView.setText("")
) tiene el mismo problema de tiempo de captura de pantalla que acabo de mencionar.
¿Alguna idea alternativa o solución a las soluciones alternativas enumeradas?
¿Qué tal implementar una superposición de diseño sobre toda su actividad?
Hazlo transparente, es un clic de forma predeterminada, por lo que no hay impacto negativo en UX mientras está en uso.
En
onPause()
establece una imagen borrosa semitransparente como fondo de ese diseño, los datos se codificarán detrás de ella.
En
onResume()
cambia el fondo a completamente transparente nuevamente.
Voila
Puede ser más rápido que otros tipos de superposiciones. El efecto secundario positivo es que si desdibuja como un breve efecto de animación cuando el usuario regresa ( con una biblioteca adecuada que usa C ++ en lugar de Java ), incluso podría verse genial y a los usuarios ni siquiera les importaría verlo.
No lo he intentado yo mismo, pero es algo que aún no has probado.
Creo que esto solo se puede lograr a través de BroadCastReceiver, pero no hay ningún receptor presente. Por lo tanto, primero deshabilita la funcionalidad de captura de pantalla predeterminada en Android y luego implementa su propia funcionalidad para tomar una captura de pantalla y antes de tomar la captura de pantalla debe desdibujar su información segura.
Hay una manera de personalizarlo.
Necesita sus actividades con datos
FLAG_SECURE
en
onCreate
en
onCreate
antes de
setContentView
.
Luego necesita una Actividad vacía, que representa lo que quiera tener como la miniatura personalizada.
Esto generalmente es una especie de pantalla de bienvenida.
Esta nueva actividad debe ser el iniciador y es la única actividad que no es
FLAG_SECURE
.
Esta Actividad se inicia y en onResume comienza su Actividad real con los datos confidenciales.
El sistema operativo Android tomará una captura de pantalla de esa nueva actividad al comienzo de su aplicación.
Lamentablemente, los usuarios también verán esta Actividad por un breve momento.
Como cualquier otra actividad es
FLAG_SECURE
, el sistema operativo Android usará la única captura de pantalla disponible que hizo al principio.
Investigué esto hace un par de meses con el mismo propósito que tú.
Desafortunadamente, tuve que concluir que simplemente no es posible. Rebusqué el código fuente de Android y lo confirmé.
-
No hay devoluciones de llamada o métodos de Android que le permitan personalizarlo (eso funciona de todos modos).
Además de
FLAG_SECURE
, esta parte del código no acepta ninguna entrada o cambio. - OnPause y métodos de ciclo de vida similares se llaman demasiado tarde (la captura de pantalla ya está tomada). Todos los métodos de ciclo de vida que sugieren que estás a punto de pasar a un segundo plano se ejecutan demasiado tarde.
-
La imagen que ve en las tareas recientes es una captura de pantalla real y, por lo tanto, no se ve afectada por los cambios que realiza (demasiado tarde) en su vista.
Eso significa que no puede modificar su vista justo a tiempo (como hacerla invisible, reemplazarla por otra cosa, agregar
SECURE_FLAG
o cualquier otra obstrucción de la vista). Además, estas imágenes se pueden encontrar en un emulador en/data/system_ce/0/recent_images
. -
La única excepción es usar
FLAG_SECURE
, que evitará que seFLAG_SECURE
la captura de pantalla de su aplicación. Experimenté configurando esta BANDERA enonPause
y eliminándola enonResume
, sin embargo, como ya se mencionó, estos métodos de ciclo de vida se ejecutan después de que ya se tomó la captura de pantalla y, por lo tanto, no tuvieron absolutamente ningún efecto.
Como se discutió en ¿Cómo cambiar la instantánea que muestra la lista de aplicaciones recientes? solía haber una devolución de llamada que podía usar para personalizar la miniatura: onCreateThumbnail . Sin embargo, esto no funciona y nunca se llama. Para ser claros, la devolución de llamada todavía está allí, simplemente nunca es invocada por el sistema operativo. El hecho de que dejó de funcionar está mal documentado, pero aparentemente fue desaprobado / eliminado silenciosamente en 4.0.3
En cuanto a la miniatura en sí, es una captura de pantalla tomada del lado del servidor.
Se toma antes de que se
onPause
(o, de hecho, antes de cualquier devolución de llamada que indique que su actividad está a punto de pasar a un segundo plano).
Cuando su aplicación pasa a segundo plano, su vista real se anima (para obtener esa transición de alejamiento).
Esa animación
puede
verse afectada a través de los cambios que realiza en
onPause
(si es lo suficientemente rápido) (Experimenté con establecer la opacidad a 0 en la ventana, entre otras cosas).
Sin embargo, esto solo afectará a la animación.
Cuando finaliza la animación, la vista se reemplaza por la captura de pantalla tomada anteriormente.
También vea estas preguntas que discuten esto: