Red de conocimiento informático - Material del sitio web - Cómo monitorear las llamadas entrantes y generar mensajes flotantes en Android

Cómo monitorear las llamadas entrantes y generar mensajes flotantes en Android

"android.permission.READ_PHONE_STATE "Permiso

Código XML

>p>

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;

}

@Override

public void onCallStateChanged(int state, String incomingNumber) {

// TODO Código auxiliar de método generado automáticamente

super.CALL_STATE_RINGING){

wm = (WindowManager)context.LayoutParams.WRAP_CONTENT;

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.