Finalizar llamada en Android programáticamente

Veo muchas preguntas de que es imposible finalizar la llamada programáticamente en Android. Al mismo tiempo, veo muchas aplicaciones de marcador en el mercado de googleplay donde puedes activar la llamada y soltarla también. ¿Cómo trabajan?

Editar : He leído en alguna parte que mi aplicación tiene que ser una aplicación de sistema. Entonces, ¿cómo hacer que el sistema, y ​​cuál es la diferencia entre el sistema y las aplicaciones de usuario?

No necesita ser una aplicación de sistema. Primero, crea el paquete com.android.internal.telephony en tu proyecto, y ponlo en un archivo llamado ” ITelephony.aidl “:

 package com.android.internal.telephony; interface ITelephony { boolean endCall(); void answerRingingCall(); void silenceRinger(); } 

Una vez que tenga eso, puede usar este código para finalizar una llamada:

 TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); Class clazz = Class.forName(telephonyManager.getClass().getName()); Method method = clazz.getDeclaredMethod("getITelephony"); method.setAccessible(true); ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager); telephonyService.endCall(); 

Podría usar esto dentro de un PhoneStateListener, por ejemplo. Para que esto funcione, necesita permisos en el manifiesto:

    

Editar: disculpas por el formato horrible, todavía no puedo entender cómo hacer bloques de código correctamente aquí: /

Para Android P (desde Beta 2) y superior, finalmente hay una API formal para endCall:

https://developer.android.com/reference/android/telecom/TelecomManager#endCall ()

Se ANSWER_PHONE_CALLS permiso ANSWER_PHONE_CALLS en manifiesto:

  

Con el permiso, para el nivel API 28 o superior:

 TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); if (tm != null) { boolean success = tm.endCall(); // success == true if call was terminated. } 

Al mismo tiempo, el método endCall() original bajo TelephonyManager ahora está protegido por el permiso MODIFY_PHONE_STATE , y ya no puede ser invocado por aplicaciones que no sean del sistema por reflexión sin el permiso (de lo contrario se activará una excepción de seguridad).

Junto con Agregar una interfaz de telefonía Android y un receptor de transmisión, también deberá agregar la entrada del receptor de manifiesto de Android con la acción android.intent.action.PHONE_STATE para el receptor que desea manejar.

Obtendrá error de tiempo de comstackción si agrega

 uses-permission android:name="android.permission.MODIFY_PHONE_STATE` 

en tu archivo de manifiesto Pero incluso si eliminamos esto, automáticamente rechaza las llamadas entrantes.

SilenceRinger() no funciona para las versiones de Android 2.3+. Solo coméntelo, otro código funcionará bien. ¡Espero que esto funcione para usted!

 public static boolean isCallActive(Context context){ AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){ return true; } return false; }