superposición superposicion para pantalla k10 desactivar cómo aplicacion alcatel android android-layout android-activity window

android - superposicion - superposición de pantalla lg k10



Cómo crear una actividad de superposición de pantalla completa siempre superior en Android (3)

Encontré que la respuesta aceptada (por tmouse) no me funcionó del todo. Tal vez funcionó para un nivel de API más antiguo? Estoy usando el nivel de API 24.

Esa respuesta en particular había recomendado:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT );

Hay un problema con esto. Los constructores que existen para WindowManager.LayoutParams son los siguientes:

Por lo tanto, el indicador WindowManager.LayoutParams.FLAG_FULLSCREEN se usa como un valor explícito para int w e int h . ¡Esto no está bien! Las dimensiones de la vista se configuran en 1024 * 1024, por lo que no llena la pantalla. E incluso si configura explícitamente el ancho y el alto del diseño para que coincidan con las dimensiones del dispositivo: no se actualizarán cuando cambie la orientación de la pantalla. Necesitamos un enfoque diferente ...

Encontré que la construcción correcta para una superposición de pantalla completa es así:

final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_FULLSCREEN, PixelFormat.TRANSLUCENT );

Esto significa que ya no especificamos explícitamente un ancho y alto. El diseño se basa totalmente en nuestras banderas en su lugar.

Sí, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN es un indicador obligatorio; es necesario si desea dibujar sobre decoraciones como la barra de estado.

Se debe utilizar WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY lugar de TYPE_SYSTEM_ALERT en el nivel de API> = 19. Esta es una nota que escribí hace un tiempo, lamentablemente no he podido encontrar una cita para corroborar por qué pensé eso, así que tómalo con una pizca de sal.

Notas de bonificación (si estás leyendo esto, probablemente estás intentando hacer una superposición de pantalla completa):

Su manifiesto necesitará estos permisos (explicación here ):

<uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Entiendo que SYSTEM_ALERT_WINDOW es el permiso real requerido, pero que ACTION_MANAGE_OVERLAY_PERMISSION también es necesario: le permite solicitar en tiempo de ejecución que el usuario otorgue el privilegio SYSTEM_ALERT_WINDOW .

Proporciono here el código fuente de mi aplicación API de nivel 24 que crea una superposición de pantalla completa.

Me gustaría poder crear una Actividad que esté siempre en la parte frontal de la pantalla de Android. No debe recibir ninguna entrada, simplemente transmítalo a la aplicación que se encuentra a continuación. Algo como un HUD.

Pude investigar que necesito establecer el tipo de ventana subyacente en TYPE_SYSTEM_ALERT, pero parece que Android está ignorando mi código; no se produce ninguna excepción incluso si elimino el permiso de manifiesto de android.permission.SYSTEM_ALERT_WINDOW. (Se requiere usar este tipo de ventana). Cuando intenté usar el tipo de ALERTA en el diálogo, funcionó bien, pero no puedo convertir el diálogo en una entidad transparente de pantalla completa. Aquí está mi código, tal vez hay algo simple que falta.

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); getWindow().setBackgroundDrawableResource(android.R.color.transparent); getWindow().setFormat(PixelFormat.TRANSLUCENT); setContentView(R.layout.main); }

La configuración translúcida debe habilitarse externamente en el manifiesto xml, de lo contrario tampoco funcionó.

<item name="android:windowIsTranslucent">true</item>


Mira esto

mencionalo en tu archivo AndroidManifest.xml

<activity android:name=".MyActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

Si quieres hacer tu Actividad a pantalla completa y transparente también.

mira esto

<activity android:name=".MyActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />


final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); WindowManager wm = (WindowManager) getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null); getWindow().setAttributes(params); wm.addView(mTopView, params);