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 en su lugar .
Conozco los siguientes enfoques, pero no se ajustan a mis requisitos:
android:excludeFromRecents de la actividad en verdadero en el manifiesto evita que la aplicación se muestre en absoluto en las tareas recientes. Esto interrumpiría la experiencia del usuario.FLAG_SECURE da como 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 apegaré a esta solución si no hay solución.onCreateThumbnail parece la solución ideal pero, desafortunadamente, no funciona, ya que actualmente el sistema operativo 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:
onPause para que se muestre su captura de pantalla en lugar de la actividad real. Pero la nueva actividad tarda demasiado en abrirse e interrumpe la experiencia del usuario.onPause . Eso me pareció una gran solución. Desafortunadamente, la captura de pantalla de 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 se cierre la aplicación al presionar "Inicio", pero la captura de pantalla resultante muestra la actividad un poco antes.textView.setText("") ) tiene el mismo problema de tiempo de captura de pantalla que se acaba de mencionar.¿Alguna idea o solución alternativa a las soluciones enumeradas?
Investigué esto hace un par de meses con el mismo propósito que tú.
Desafortunadamente, tuve que concluir que simplemente no es posible. Busqué en el código fuente de Android y lo confirmé.
FLAG_SECURE , esta parte del código no acepta ninguna entrada o cambio.SECURE_FLAG o cualquier otra obstrucción de la vista). Aparte, estas imágenes se pueden encontrar en un emulador en /data/system_ce/0/recent_images .FLAG_SECURE , que evitará que se tome la captura de pantalla de su aplicación. Experimenté configurando esta BANDERA en onPause y eliminándola en onResume , 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 ningún efecto.Como se discutió en ¿Cómo cambiar la instantánea que se muestra en 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 el sistema operativo nunca la llama. El hecho de que dejó de funcionar está mal documentado, pero aparentemente quedó obsoleto/eliminado en silencio en 4.0.3
En cuanto a la miniatura en sí, es una captura de pantalla tomada en el servidor. Se toma antes de que se llame a onPause (o, de hecho, antes de que se llame 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 un segundo plano, su vista real está animada (para obtener esa transición de alejamiento). Esa animación puede verse afectada por los cambios que haces en onPause (si eres lo suficientemente rápido) (experimenté con establecer la opacidad en 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:
¿Qué tal implementar una superposición de diseño encima de toda su actividad?
Hágalo transparente, se hace clic de forma predeterminada, por lo que no tiene un impacto negativo en UX mientras está en uso.
En onPause() , establezca una imagen semitransparente y borrosa como fondo de ese diseño, los datos se codificarán detrás de ella. En onResume() cambie el fondo a completamente transparente nuevamente. Voilá.
Puede ser más rápido que otros tipos de superposiciones. El efecto secundario positivo es que, si eliminas el desenfoque como un efecto de animación breve 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 probado yo mismo, pero es algo que tú aún no has probado.
Actualmente (28/10/2020) es imposible personalizar la miniatura de la aplicación en la pantalla de aplicaciones recientes.
Como explicó @Dellkan en la respuesta anterior, el sistema operativo ya no llama al método onCreateThumbnail .
Desafortunadamente, tampoco funciona la sugerencia de crear una especie de pantalla de inicio/splash sin el indicador FLAG_SECURE para permitir que la aplicación tome una captura de pantalla de esa actividad , porque la captura de pantalla se toma en la actividad que ves y no en el inicio de la aplicación. .
Ni siquiera puede personalizar el color del fondo de la ventana cuando usa FLAG_SECURE como se informa aquí .