Cómo monitorear las llamadas entrantes y generar mensajes flotantes en Android
Código XML
Yo también Es necesario registrar la llamada entrante. La forma actual de manejarla es recibir la transmisión de inicio y luego registrar la llamada entrante después de recibir la transmisión. Para recibir transmisiones BOOT, necesita el permiso "android.permission.RECEIVE_BOOT_COMPLETED", que se declara en el manifiesto de la siguiente manera Código Java Luego registre la clase de receptor de transmisión Código XML PhoneBootReceiver está registrado para escuchar llamadas entrantes, primero debe obtener el servicio del sistema "TELEPHONY_SERVICE" Código Java TelephonyManager telM = ( TelephonyManager)getSystemService (Context.TELEPHONY_SERVICE); Luego agregue el oyente código Java telM.listen(new TelListener(context), PhoneStateListener.LISTEN_CALL_STATE) ; TelListener es una clase de escucha de estado de teléfono personalizada que hereda de PhoneStateListener. Para escuchar llamadas entrantes, solo necesita implementar onCallStateChanged(int state, String. incomingNumber). /p> Ejem... El título habla de una ventana flotante emergente. De hecho, la ventana flotante es para agregar una Vista en WindowManager. Para implementar la ventana flotante, primero debe tener "android". .permission.SYSTEM_ALERT_WINDOW "Permiso, declarado en el manifiesto de la siguiente manera: > Se debe acceder a WindowManager a través del contexto. getApplicationContext().getSystemService(Context.WINDOW_SERVICE ). Enumere primero el código fuente de TelListener y luego explique en detalle Código XML clase pública TelListener extiende PhoneStateListener { privado Contexto de contexto; WindowManager privado wm; TV TextView privado; TelListener público (contexto de contexto){ this.context = contexto; p > } @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Código auxiliar de método generado automáticamente p > super.CALL_STATE_RINGING){ wm = (WindowManager)context.LayoutParams.WRAP_CONTENT; span >params.format = PixelFormat.RGBA_8888; tv = new TextView(contexto); tv. setText("Esta es la ventana emergente, ID de llamada: " + número entrante); wm.addView(tv,params); }else if(state == TelephonyManager.CALL_STATE_IDLE ){ if(wm ! = null){ wm.removeView(tv); } } } } } } estado == TelephonyManager.CALL_STATE_RING significa Hay un teléfono nuevo. CALL_STATE_IDLE significa que la llamada se ha desconectado (tal vez la comprensión no sea muy precisa, cuando la llamada cuelgue, el estado será igual a TelephonyManager.CALL_STATE_IDLE) Definir diseño de ventana Código Java WindowManager.LayoutParams params = new WindowManager.LayoutParams(); Establece el tipo de ventana sobre todas las ventanas Código Java params.type = WindowManager .LayoutParams.TYPE_SYSTEM_OVERLAY; No olvides Código Java params.flags = WindowManager.LayoutParams.FLAG_NOT_ TOUCH_MODAL | .LayoutParams.FLAG_NOT_FOCUSABLE; Sin esta declaración, después de generar la ventana flotante, no podrá hacer clic en la interfaz detrás de la ventana flotante. El propósito de esta declaración es hacer que la ventana flotante pierda el foco. Transparencia de fondo Código Java params.format = PixelFormat.RGBA_8888; En este ejemplo, la ventana flotante simplemente muestra A TextView con el contenido "Esta es una ventana flotante, identificador de llamadas: xxxxxx" y, finalmente, agregue TextView al formulario Código Java wm.addView(tv, param) wm.addView(tv, param)addView(tv, params); Elimina TextView después de desconectar la llamada; de lo contrario, siempre se mostrará... Código Java wm.removeView(tv); La... Eso es todo por este artículo... "¿Qué? ¿Extraíble? " Para poder arrastrar texto, TextView agrega setOnTouchListener, que implementa el método onTouchListener de OnTouchListener. Código Java params.type=WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; Modificar a Código Java params.type=WindowManager.LayoutParams.TYPE_PHONE; Debido a que se utiliza TYPE_SYSTEM_OVERLAY, TextView no podrá obtener el foco de entrada y no se podrá arrastrar.