Cómo importar com.android.internal.telephony.ITelephony a la aplicación de Android

Quiero colgar la llamada entrante, la detecto y luego quiero colgarla.

El problema es que esto: com.android.internal.telephony.ITelephony no se resuelve.

Traté de agregar el paquete com.android.internal.telephony a mi aplicación y crear una interfaz:

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

pero la llamada no ha terminado.

Aquí detecto la llamada, muestra un brindis (se muestra) y luego bash colgar, pero como dije primero no había com.android.internal.telephony.ITelephony antes de crear ese paquete:

 private class CallStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: // called when someone is ringing to this phone Toast.makeText(ctx, "Incoming: " + incomingNumber, Toast.LENGTH_LONG).show(); try{ TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); Class c = Class.forName(tm.getClass().getName()); Method m = c.getDeclaredMethod("getITelephony"); com.android.internal.telephony.ITelephony telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); telephonyService.silenceRinger(); telephonyService.endCall(); }catch (Exception e) { e.printStackTrace(); } break; } } } 

Mi manifiesto y permisos:

                  

La interfaz ITelephony es interna, por lo que no puede obtener una referencia estándar. Podrías usar la reflexión todo el camino, es decir,

 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); Method m1 = tm.getClass().getDeclaredMethod("getITelephony"); m1.setAccessible(true); Object iTelephony = m1.invoke(tm); Method m2 = iTelephony.getClass().getDeclaredMethod("silenceRinger"); Method m3 = iTelephony.getClass().getDeclaredMethod("endCall"); m2.invoke(iTelephony); m3.invoke(iTelephony); 

Pero de cualquier forma, esos métodos necesitan el permiso MODIFY_PHONE_STATE , que solo se puede otorgar a las aplicaciones del sistema. Así que me temo que no funcionará de todos modos.

Para kotlin:

  val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager val m1 = tm::class.java.getDeclaredMethod("getITelephony") m1.setAccessible(true) val telephonyService = m1.invoke(tm) val m2 = telephonyService::class.java.getDeclaredMethod("silenceRinger") val m3 = telephonyService::class.java.getDeclaredMethod("endCall") m2.invoke(telephonyService) m3.invoke(telephonyService)