Estoy tratando de hacer una aplicación como, cuando llega una llamada al teléfono, quiero detectar el número. A continuación se muestra lo que intenté, pero no detecta llamadas entrantes.
Quiero ejecutar mi MainActivity
fondo, ¿cómo puedo hacer eso?
Había dado el permiso en el manifest
archivo.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
¿Hay algo más que deba proporcionar en el manifiesto?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Respuestas:
Esto es lo que uso para hacer esto:
Manifiesto:
Mi base de detector de llamadas reutilizables
Luego, para usarlo, simplemente deriva una clase de él e implementa algunas funciones fáciles, cualesquiera que sean los tipos de llamadas que te interesen:
Además, puedes ver una reseña que hice sobre por qué el código es como está en mi blog . Enlace general: https://gist.github.com/ftvs/e61ccb039f511eb288ee
EDITAR: actualizado a un código más simple, ya que he modificado la clase para mi uso
fuente
lastState
no debe inicializarse aCALL_STATE_IDLE
. Me faltan algunas llamadas cuando mi aplicación se mata mientras el estado actual esRINGING
. Porque cuando se vuelveIDLE
a hacer cuando finaliza la llamada, la variable estática se reiniciaCALL_STATE_IDLE
y no se desprende haciendo nada. Entonces perdemos la referencia alastState
.para registrarse
y anular el registro
fuente
Con Android P - Api Nivel 28: necesita obtener el permiso READ_CALL_LOG
Acceso restringido a registros de llamadas
P Android mueve los
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
, yPROCESS_OUTGOING_CALLS
los permisos delPHONE
grupo de permisos para el nuevoCALL_LOG
grupo de permisos. Este grupo ofrece a los usuarios un mejor control y visibilidad de las aplicaciones que necesitan acceso a información confidencial sobre llamadas telefónicas, como leer registros de llamadas telefónicas e identificar números telefónicos.Para leer los números de la acción intencional PHONE_STATE, necesita tanto el
READ_CALL_LOG
permiso como elREAD_PHONE_STATE
permiso . Para leer númerosonCallStateChanged()
, ahora solo necesita elREAD_CALL_LOG
permiso. Ya no necesitas elREAD_PHONE_STATE
permiso.fuente
READ_CALL_LOG
en elAndroidManifest.xml
enfoque en la adición de una solicitud de permiso deMainActivity
.ACTUALIZACIÓN: El código realmente impresionante publicado por Gabe Sechan ya no funciona a menos que solicite explícitamente al usuario que otorgue los permisos necesarios. Aquí hay un código que puede colocar en su actividad principal para solicitar estos permisos:
TAMBIÉN: Como alguien mencionó en un comentario debajo de la publicación de Gabe , debe agregar un pequeño fragmento de código
android:enabled="true
al receptor para detectar llamadas entrantes cuando la aplicación no se está ejecutando actualmente en primer plano:fuente
esto puede ayudarlo y también agregar requerir permiso
fuente
Solo para actualizar la respuesta de Gabe Sechan. Si su manifiesto solicita permisos para READ_CALL_LOG y READ_PHONE_STATE, onReceive llamará TWICE . Uno de ellos tiene EXTRA_INCOMING_NUMBER y el otro no. Tienes que probar cuál lo tiene y puede ocurrir en cualquier orden.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
fuente
Aquí hay un método simple que puede evitar el uso
PhonestateListener
y otras complicaciones.Así que aquí estamos recibiendo los 3 eventos de Android como
RINGING
,OFFHOOK
yIDLE
. Y con el fin de obtener el posible estado de llamada, tenemos que definir nuestros propios estados comoRINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Puede manejar todos los estados en una llamada telefónica.Piense de alguna manera que estamos recibiendo eventos de Android y definiremos nuestros estados de guardia. Mira el código.
fuente
@ Gabe Sechan, gracias por tu código. Funciona bien excepto el
onOutgoingCallEnded()
. Nunca se ejecuta. Los teléfonos de prueba son Samsung S5 y Trendy. Hay 2 errores, creo.1: faltan un par de paréntesis.
2:
lastState
no se actualizastate
si está al final de la función. Debe ser reemplazado a la primera línea de esta función porAdicional he puesto
lastState
ysavedNumber
en preferencia compartida como usted sugirió.Solo lo probé con los cambios anteriores. Error solucionado al menos en mis teléfonos.
fuente
Por favor use el siguiente código. Le ayudará a obtener el número entrante con otros detalles de la llamada.
activity_main.xml
MainActivity.java
y en su solicitud de manifiesto para los siguientes permisos:
fuente
Necesita un BroadcastReceiver para que
ACTION_PHONE_STATE_CHANGED
esto lo reciba cuando el estado del teléfono cambie de inactivo, sonando, descolgado del valor anterior y del nuevo valor que puede detectar si se trata de una llamada entrante / saliente.El permiso requerido sería:
Pero si también desea recibir EXTRA_INCOMING_NUMBER en esa transmisión, necesitará otro permiso: "android.permission.READ_CALL_LOG"
Y el código algo como esto:
y en la clase de receptor, podemos obtener el estado actual leyendo una intención como esta:
El resultado de los extras podría ser:
Con la transmisión PHONE_STATE no necesitamos usar el permiso PROCESS_OUTGOING_CALLS o la acción obsoleta NEW_OUTGOING_CALL.
fuente