2009-03-01 25 views
42

Estoy desarrollando una aplicación donde una de las cosas que necesitamos es controlar la llamada saliente, al menos para poder detenerla desde nuestra aplicación.¿Cómo colgar la llamada saliente en Android?

He intentado usar Intent.ACTION_CALL de una actividad existente:

Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber)); 
startActivity(callIntent); 

Pero detener la llamada parece ser anulado a través de la API.

¿Puede sugerir alguna solución?

Por ejemplo: ¿habilitar el modo avión durante la llamada? Solo un ejemplo; este truco no funcionó para mí.

+0

Did usando 'BroadcastReceiver' trabaja para usted? ¿Podrían revisar esta pregunta y/o aceptar una respuesta? –

+0

La finalización de la llamada es posible. TextMe4Callback en el mercado de Android hace esto. –

Respuesta

3

Teniendo en cuenta la posibilidad de travesuras maravillosas, me sorprendería si esto está permitido.

Este hilo dice rotundamente que the API cannot end a call. Otros have tried.

+3

Entonces, ¿cómo lo hicieron en [tCallBlocking Lite] (http://www.taosoftware.co.jp/en/android/callblockinglite/)? – an0

+1

Claro que es posible. Vea la respuesta arriba. –

21
  1. Crear un BroadcastReceiver con la prioridad 0.
  2. En la intersección antes de Cristo la intención ACTION_NEW_OUTGOING_CALL en su método onReceive
  3. llamada setResultData(null) en el mismo método

Esto evitará que la llamada de iniciando (siempre y cuando su receptor sea el último en procesar el intento, creo)

+2

Puedo verificar que esto funcione en Android 2.1 y 2.2. –

+0

también uso de esta manera. – Nissan911

+0

¿Alguna idea sobre por qué esto funciona en Android 2.3.3 y versiones anteriores, pero no en Android 4.0 y versiones posteriores? Parece que no puedo ver el ACTION_NEW_OUTGOING_CALL con mi BroadcastReceiver. Sin embargo, no estoy interesado en la parte de cancelación de llamadas, solo sabiendo sobre una llamada no puedo trabajar. Cualquier pensamiento sería apreciado, gracias! – DonnaLea

5

Puede intentar habilitar y luego di sabling modo avión:

android.provider.Settings.System.putInt(getContentResolver(), 
     android.provider.Settings.System.AIRPLANE_MODE_ON, 1); 

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
intent.putExtra("state", 1); 
sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
sendBroadcast(intent); 
android.provider.Settings.System.putInt(getContentResolver(), 
     android.provider.Settings.System.AIRPLANE_MODE_ON, 0); 

intent.putExtra("state", 0); 
sendBroadcast(new Intent("android.intent.action.AIRPLANE_MODE")); 
sendBroadcast(intent); 
+11

Almádena, cumple con la tuerca. –

+3

en este momento no hay manera de colgar una llamada saliente, la solución propuesta por Gung Shi Jie es una buena idea, pero no funciona, los cambios en el estado "MODO AEROPLANO" se ignorarán durante una llamada saliente, es funciona solo en terminales emulaterd durante el desarrollo, probé y falle en teléfonos HTC Desire y Acer Liquid. –

0

De acuerdo con la documentación sobre ACTION_NEW_OUTGOING_CALL

La Intención tendrá el siguiente valor añadido:

EXTRA_PHONE_NUMBER - el número de teléfono originalmente destinado a ser marcado.

Una vez que finaliza la transmisión, los resultData se utilizan como el número real para llamar. Si es nulo, no se realizará ninguna llamada.

+1

Esta es una explicación de [respuesta de Ash] (http://stackoverflow.com/questions/599443/android-how-to-hang-up-outgoing-call/637284#637284), que usa 'setResultData (null)' . –

4

Por Ilana:

public class ilanasReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
      if (getResultData()!=null) { 
       String number = "123456"; 
       setResultData(number); 
      } 
     } 
    } 
} 

Además de manifiesto poner en la sección del paquete:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 

Eso es todo.

29

La captura de la llamada saliente en una BroadcastReceiver se ha mencionado y es sin duda la mejor manera de hacerlo si desea finalizar la llamada antes de marcar.

Sin embargo, una vez marcado o en llamada, esa técnica ya no funciona. La única manera de colgar que he encontrado hasta ahora es hacerlo a través de Java Reflection. Como no es parte de la API pública, debe usar y no confiar en ella.Cualquier cambio en la composición interna de Android romperá efectivamente su aplicación.

Prasanta Paul's blog demonstrates cómo se puede lograr, lo que he resumido a continuación.

La obtención de la ITelephony objeto:

TelephonyManager tm = (TelephonyManager) context 
     .getSystemService(Context.TELEPHONY_SERVICE); 
try { 
    // Java reflection to gain access to TelephonyManager's 
    // ITelephony getter 
    Log.v(TAG, "Get getTeleService..."); 
    Class c = Class.forName(tm.getClass().getName()); 
    Method m = c.getDeclaredMethod("getITelephony"); 
    m.setAccessible(true); 
    com.android.internal.telephony.ITelephony telephonyService = 
      (ITelephony) m.invoke(tm); 
} catch (Exception e) { 
    e.printStackTrace(); 
    Log.e(TAG, 
      "FATAL ERROR: could not connect to telephony subsystem"); 
    Log.e(TAG, "Exception object: " + e); 
} 

Terminar la comunicación:

telephonyService.endCall(); 
+6

+1 No es una buena práctica, pero OP pide específicamente una solución para algo que no está permitido por la API, por lo tanto, esta es una buena respuesta. –

+1

¡Si esta es la única solución, entonces creo que esta es una gran respuesta! – TacB0sS

+0

hey no puedo bloquear la llamada particular por este código. Marqué –

25

Prueba esto:

(he usado Reflection to access advanced telephony features y modificar algunas cosas)

// required permission <uses-permission android:name="android.permission.CALL_PHONE"/> 

try { 
    //String serviceManagerName = "android.os.IServiceManager"; 
    String serviceManagerName = "android.os.ServiceManager"; 
    String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
    String telephonyName = "com.android.internal.telephony.ITelephony"; 

    Class telephonyClass; 
    Class telephonyStubClass; 
    Class serviceManagerClass; 
    Class serviceManagerStubClass; 
    Class serviceManagerNativeClass; 
    Class serviceManagerNativeStubClass; 

    Method telephonyCall; 
    Method telephonyEndCall; 
    Method telephonyAnswerCall; 
    Method getDefault; 

    Method[] temps; 
    Constructor[] serviceManagerConstructor; 

    // Method getService; 
    Object telephonyObject; 
    Object serviceManagerObject; 

    telephonyClass = Class.forName(telephonyName); 
    telephonyStubClass = telephonyClass.getClasses()[0]; 
    serviceManagerClass = Class.forName(serviceManagerName); 
    serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 

    Method getService = // getDefaults[29]; 
    serviceManagerClass.getMethod("getService", String.class); 

    Method tempInterfaceMethod = serviceManagerNativeClass.getMethod(
       "asInterface", IBinder.class); 

    Binder tmpBinder = new Binder(); 
    tmpBinder.attachInterface(null, "fake"); 

    serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
    IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
    Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 

    telephonyObject = serviceMethod.invoke(null, retbinder); 
    //telephonyCall = telephonyClass.getMethod("call", String.class); 
    telephonyEndCall = telephonyClass.getMethod("endCall"); 
    //telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall"); 

    telephonyEndCall.invoke(telephonyObject); 

} catch (Exception e) { 
    e.printStackTrace(); 
    Log.error(DialerActivity.this, 
       "FATAL ERROR: could not connect to telephony subsystem"); 
    Log.error(DialerActivity.this, "Exception object: " + e); 
} 
+1

gracias funciona bien para colgar una llamada telefónica lanzar una aplicación – shereifhawary

+3

funciona excelente. [required permission ""] –

+0

funciona muy bien. ¿Conoces otras acciones de llamada útiles, como habilitar el hablante, responder, ...? –

Cuestiones relacionadas