2012-04-07 14 views
11

Hasta Android 2.2 Sé que puedo usar la reflexión y finalizar la llamada a través de getITelephony.¿Cómo finaliza una llamada mediante programación en 2.3+?

Sin embargo, a partir de 2,3 esto ya no funciona porque incluso si concede el permiso MODIFY_PHONE_STATE a su aplicación, es ahora una aplicación del sistema único permiso: https://stackoverflow.com/a/5095956/821423

Dicho esto, es posible todavía debido a que un gran número de aplicaciones en el mercado de juegos google lo están haciendo muy bien en ICS, por ejemplo, ésta:

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 contestar la llamada utilizando la simulación de un gancho de auriculares, pero no puedo entender cómo finalizar la llamada.

Gracias.

Respuesta

18

Bueno, después de mucho examen de conciencia me doy cuenta de algo muy, muy, muy tonto. En el lado positivo, nadie en StackOverflow parece haberlo notado tampoco. MODIFY_PHONE_STATE ya no funciona en silenceRinger() desde 2.3+, pero endCall está bien.

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

¡No puedo creer que acabo de pasar una semana en esto! Trataré de actualizar las otras preguntas ya que parece que hay toneladas de tontos en SO a lo largo de las líneas de 'no es posible usar la reflexión para terminar las llamadas'.

+0

Es decir, podemos utilizar la técnica de Stil ITelephony.aidl para aceptar y rechazar llamadas mediante programación, pero sólo no funciona para silencioRinger? Entonces la única solución que queda es comentar el silenceRinger en el archivo aidl? Pls sugiere, ya que su descubrimiento en este me permitiría utilizar esta técnica en el diseño de una nueva aplicación. –

+0

En 2.3.6, endCall() a través de iTelephony hace justamente eso. De hecho, es silenceRinger() que desencadena el problema de permiso. Simplemente puede comentar silenceRinger() en su código actual, deje el AIDL como tal. No he probado esto en 1.5 a 2.2, pero estoy a punto de hacerlo pronto. Te lo haré saber en esta página. –

+0

Wow ... en realidad tenía endCall() en mi código, pero no recibía ningún golpe debido a algunas declaraciones if. Simplemente asumí que no estaba funcionando porque la API estaba deshabilitada. Estoy tentado de marcar su respuesta para su eliminación, ¡así que Google no soluciona este problema! :) +1 – you786

1

privada FinLlam vacío (cutofftime final String) {

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(); 
    } 

} 
Cuestiones relacionadas