superposición superposicion samsung para pantalla desactivar como aplicacion android

android - superposicion - superposición de pantalla samsung j7



¿Creando una superposición del sistema donde los botones de inicio aún funcionan? (2)

  1. Usted no puede O tipos de ventana juntos. Va a crear algún otro tipo al azar. Y para ser honesto, los tipos de ventana que está utilizando realmente no fueron diseñados para ser utilizados por las aplicaciones (es por eso que tienen la palabra "sistema" en ellas).

  2. ¿Qué quiere decir con "los botones de tecla suave ya no funcionan"? No debería ser posible dejar de trabajar, si es que es un gran problema (me gustaría saber el código para hacer esto). Las otras claves se entregan al foco clave actual; Si no quieres FLAG_NOT_FOCUSABLE , usa FLAG_NOT_FOCUSABLE .

  3. La documentación para cada una de estas banderas debe ser bastante clara de lo que hace, así que elija las banderas que hacen lo que quiere. FLAG_NOT_FOCUSABLE porque no desea tomar eventos clave. FLAG_NOT_TOUCH_MODAL porque no quieres bloquear eventos táctiles que estén fuera de tu ventana. No dices que quieres averiguar sobre las prensas fuera de tu ventana, por lo que no hay razón para usar FLAG_WATCH_OUTSIDE_TOUCH .

Estoy tratando de crear un botón que está siempre en la pantalla.

  1. El botón debe ser pulsable y cualquier cosa directamente debajo del botón no debe activarse en una pulsación.
  2. La actividad o la pantalla de inicio que se ejecuta detrás del botón aún debe funcionar, lo que significa que el usuario todavía debe poder interactuar con la pantalla de inicio o la aplicación.
  3. Los botones de las teclas programables todavía deberían funcionar: inicio, atrás, menú, etc.

El siguiente código hace # 1 y # 2 pero los botones de las teclas programables ya no funcionan:

WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);

Cambiarlo a esto desactiva la superposición de clics pero los trabajos # 2 y # 3 funcionan:

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

Finalmente, en este ejemplo, se hace clic en la superposición y en lo que está directamente detrás:

WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,

¿Cómo puedo cambiar esto para que se pueda hacer clic en la superposición, qué no se puede hacer clic directamente debajo de ella, y todo lo que está fuera de la superposición funciona, incluidos los botones de inicio?

Una aplicación de ejemplo que realiza todo esto es Super Manager.

ACTUALIZACIÓN: encontré que lo siguiente permite usar el botón de inicio, pero aún no los otros botones:

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH

,


Veo que pcm2a no publicó una solución de trabajo, así que también podría hacerlo por él.

Nota : Aunque presento una solución de trabajo, el uso de tales métodos no es 100% correcto con respecto al diseño de la arquitectura de Android. Recomiendo pedirle a alguien del equipo de desarrollo de Android más información (y por favor publique su respuesta aquí para que todos la veamos).

Permisos

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

Servicio

package com.vidmind.test.service.video; import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.media.MediaPlayer; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.VideoView; public class TestVideoService extends Service { /** Command to the service to display a message */ public static final int MSG_PLAY_VIDEO = 1; public static final int MSG_VIDEO_LOOP_MODE = 2; /** Bundle Strings */ public static final String KEY_VIDEO_URL = "KEY_VIDEO_URL"; public static final String KEY_VIDEO_LOOP_MODE = "KEY_VIDEO_LOOP_MODE"; // Binder given to clients private static final String TAG = "TestVideoService"; final Messenger mMessenger = new Messenger(new IncomingHandler()); private LinearLayout mOverlay; private VideoView mVideoView; private boolean mVideoLoop = true; /** ****************** Handler implementation class ****************** **/ /** * Handler of incoming messages from clients. */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { Bundle bundle; switch (msg.what) { case MSG_PLAY_VIDEO: bundle = msg.getData(); String url = bundle.getString(KEY_VIDEO_URL); play(url); break; case MSG_VIDEO_LOOP_MODE: bundle = msg.getData(); boolean looping = bundle.getBoolean(KEY_VIDEO_LOOP_MODE); setVideoLoop(looping); break; default: super.handleMessage(msg); } } } /** ****************************************************************** **/ @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "Service has started"); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "Serice destroyed"); // Remove view from WindowManager WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.removeView(mOverlay); mOverlay = null; mVideoView = null; } /** ****************** Private Functions ****************** **/ /** * Set video loop mode * @param value */ private void setVideoLoop(boolean value) { mVideoLoop = value; } /** * Start playing the movie * @param url * @returns success/failure */ private boolean play(String url) { boolean isSuccess = false; if (mOverlay != null && mVideoView.isPlaying()) { Log.w(TAG, "Cannot recreate video overlay"); return isSuccess; } // Create overlay video createOverlay(mOverlay != null); if (!mVideoView.isPlaying()) { mVideoView.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.setLooping(mVideoLoop); } }); mVideoView.setVideoURI(Uri.parse(url)); mVideoView.requestFocus(); mVideoView.start(); isSuccess = true; } return isSuccess; } /** * Create video overlay * * @param isCreated */ private void createOverlay(boolean isCreated) { if (isCreated) return; // Create System overlay video WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FILL_PARENT, 150, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); params.gravity = Gravity.BOTTOM; LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); mOverlay = (LinearLayout) inflater.inflate(R.layout.main, null); mVideoView = (VideoView) mOverlay.findViewById(R.id.video_player); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mOverlay, params); } }

layout.main

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <VideoView android:id="@+id/video_player" android:layout_width="120dp" android:layout_height="120dp"/> </LinearLayout>

¡Feliz codificación!
amir