es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo detectar el número de teléfono de una llamada entrante en Android cuando la aplicación está cerrada?

Quiero detectar los números de teléfono de las llamadas entrantes/salientes cuando mi aplicación no se está ejecutando, está cerrada. He implementado el siguiente código, pero solo detecta la llamada si la aplicación se está ejecutando o en segundo plano, no funciona cuando la aplicación está cerrada.

public class CallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            String outgoingPhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
            showToast(context, "Llamada saliente a " + outgoingPhoneNumber);
        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            String callEndedNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            showToast(context, "Llamada finalizada a " + callEndedNumber);
        } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            showToast(context, "Llamada entrante de " + incomingNumber);
        }
    }

    private void showToast(Context context, String message) {
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }

}

Manifiestos

<receiver android:name=".CallReceiver" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"></action>
        </intent-filter>
</receiver>
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para detectar los números de teléfono de las llamadas entrantes/salientes cuando la aplicación no se encuentra en ejecución o está cerrada, necesitas registrar el receptor de difusión de manera dinámica utilizando el contexto de la aplicación en tu código. Puedes hacer esto agregando lo siguiente a tu MainActivity:

    private CallReceiver callReceiver;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerReceiver();
    }
    
    private void registerReceiver() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.PHONE_STATE");
        callReceiver = new CallReceiver();
        getApplicationContext().registerReceiver(callReceiver, intentFilter);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(callReceiver != null){
            getApplicationContext().unregisterReceiver(callReceiver);
        }
    }
    

    Esto registrará de manera dinámica el receptor de difusión cuando la aplicación se lance y lo desregistrará cuando la aplicación se destruya para evitar fugas de memoria.

    Nota: Asegúrate de haber otorgado los permisos necesarios en tu archivo Manifest para detectar cambios en el estado del teléfono.

Comments are closed.