¿Cómo termina programáticamente una llamada en 2.3+?

Hasta Android 2.2 Sé que puedo utilizar la reflexión y terminar la llamada a través de getITelephony.

Sin embargo, a partir de 2.3, esto ya no funciona porque, incluso si concede el permiso MODIFY_PHONE_STATE a su aplicación, ahora es un permiso de sólo aplicación del sistema: https://stackoverflow.com/a/5095956/821423

Dicho esto, todavía es posible porque una gran cantidad de aplicaciones en el mercado de Google Play están haciendo muy bien en ICS, por ejemplo, este:

Https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en

Así que la pregunta es, ¿cómo lo hacen? Sé que puedo recoger la llamada mediante la simulación de un gancho de auriculares, pero no puedo averiguar cómo terminar la llamada.

Gracias.

Bueno, después de mucha búsqueda del alma, me doy cuenta de algo realmente, realmente, realmente tonto. En el lado positivo, nadie en StackOverflow parece haberlo notado tampoco. MODIFY_PHONE_STATE ya no está trabajando en silenceRinger () desde 2.3+, pero endCall está bien.

Así que la solución es comentar la llamada a silentRinger ().

No puedo creer que he pasado una semana en esto! Voy a tratar de actualizar las otras preguntas, ya que parece haber toneladas de dupe en SO a lo largo de las líneas de "no es posible utilizar la reflexión para terminar las llamadas más".

Las funciones call (), endcall () funcionan bien para mí también. Pero también hay otra manera en que funciona sin usar iTelephony.aidl. Su publicada en este post. BTW creo que google ya sabe, pero por alguna razón no han hecho nada con el resto de funciones, lo que es bueno!

http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

Private void endCall (final String cutofftime) {

TelephonyManager telephony = (TelephonyManager) srvs .getSystemService(Context.TELEPHONY_SERVICE); Class c; final com.android.internal.telephony.ITelephony telephonyService; try { c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName()); Log.i("TelephonyClass Name", telephony.getClass().getName()); Method m = c.getDeclaredMethod("getITelephony"); m.setAccessible(true); telephonyService = (ITelephony) m.invoke(telephony); TimerTask task = new TimerTask() { @Override public void run() { try { if (telephonyService.isIdle() || telephonyService.isOffhook() || telephonyService.isRinging()) telephonyService.endCall(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; long delay = Integer.parseInt(cutofftime) * 1000; new Timer().schedule(task, delay); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.