2012-04-10 10 views
17

Me gustaría poder crear una actividad que siempre esté en la parte delantera de la pantalla de Android. No debe recibir ninguna entrada, solo pásalo a la aplicación que esté debajo de él. Algo así como un HUD.Cómo crear una actividad de superposición de pantalla completa siempre superior en Android

Pude investigar que necesito establecer el tipo de ventana subyacente a TYPE_SYSTEM_ALERT pero parece que Android está ignorando mi código, sin excepción, incluso si elimino el permiso android.permission.SYSTEM_ALERT_WINDOW del manifiesto. (se requiere usar este tipo de ventana). Cuando traté de usar el tipo ALERT 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 falte algo simple.

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); 
} 

entorno translúcido tiene que ser activado externamente en el manifiesto XML, de lo contrario también no funcionaba.

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

Respuesta

23
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); 
+0

¿Cómo terminó su método onCreate? Estoy tratando de probar esto yo mismo ahora. – Rell3oT

+3

ViewGroup mTopView = (ViewGroup) App.inflater.inflate (R.layout.main, null); @tmouse ¿Qué es la aplicación aquí? – rana

+1

@tmouse ¿Qué es R.layout.main? ¿es el diseño de la actividad? o una vista de relleno transparente? – Premier

0

Control hacia fuera este

lo mencionan en su archivo AndroidManifest.xml

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

si desea hacer su actividad en pantalla completa y transparente también

la salida de este

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

Gracias, pero lo arriba logra solamente es la creación de actividad como fulscreen/transparente. Lo que trato de hacer es hacer que la actividad SIEMPRE esté en la parte superior, independientemente de lo que esté haciendo el usuario (iniciando otras aplicaciones, bloqueando el teléfono, etc.). – tmouse

+0

hicieron que utilizó '' en el archivo de manifiesto si no se echa un vistazo a este – Ravi1187342

+0

Sí, como he escrito he utilizado esto, pero como se ejecuta el código anterior, este permiso nunca se usa (lo que es incorrecto, se requiere permiso para que aparezca dicha ventana). – tmouse

1

Encontré que the accepted answer (by tmouse) no funcionó para mí. Tal vez funcionó para un nivel de API más antiguo? Estoy usando API de nivel 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:

enter image description here

Así la bandera WindowManager.LayoutParams.FLAG_FULLSCREEN se acostumbra como un valor explícito para int w y int h. ¡Esto no está bien! Las dimensiones de su vista se establecen en 1024 * 1024, por lo que no se rellene la pantalla. E incluso si explícitamente establece el ancho y alto del diseño para que coincida con las dimensiones del dispositivo: se no se actualiza cuando cambia la orientación de la pantalla. Necesitamos un enfoque diferente ...


encontré que el correcta la construcción de una superposición de pantalla completa es de esta manera:

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 explícitamente especificar una anchura y altura. El diseño depende completamente de nuestras banderas en su lugar.

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

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


notas de bonificación (si estás leyendo esto, es probable que tratar de hacer una superposición de pantalla completa):

Su manifiesta tendrá 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 también es necesario ACTION_MANAGE_OVERLAY_PERMISSION: le permite solicitar en tiempo de ejecución que el usuario otorgue el privilegio SYSTEM_ALERT_WINDOW.

que proporcionan here el código fuente a nivel de la API de trabajo 24 aplicación que crea una superposición de pantalla completa.

Cuestiones relacionadas