2010-05-06 14 views
9

Estoy tratando de implementar mi propia interfaz de usuario de manejo de llamadas telefónicas.¿Cómo aceptar una llamada entrante haciendo clic en un botón?

Lo que quiero hacer es, si entra una llamada, se muestran el número de teléfono entrante y una imagen, y, si presiono un botón, la llamada entrante será aceptada/contestada.

El código relacionado es:

@Override 
    public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    answerButton = (Button) findViewById(R.id.pickup); 
    answerButton.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v) { 
      Intent intent = new Intent("android.intent.action.ANSWER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent);   
     } 
    }); 

Lamentablemente, el código no funciona. En un primer momento, se produce una excepción si presiono el botón de mi respuesta:

ActivityNotFoundException: no hemos encontrado actividad de manejar Intención {
act = android.intent.action.ANSWER

Luego añade una entrada en AndroidManifest.xml:

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

Ejecuto la aplicación de nuevo, ya no hay ninguna excepción. Sin embargo, dudo que la llamada entrante no sea realmente aceptada. Porque si presiona el botón de respuesta de la pantalla de Android (botón verde), se acepta la llamada entrante y aparece un icono de llamada verde en la esquina superior izquierda de la pantalla del emulador, mientras que mi aplicación no.

También leo el código fuente de la aplicación del teléfono en la fuente de Android. Hay un método como acceptCall() en la clase de teléfono. Pero estos códigos parecen difíciles para mí utilizar, porque hay muchos declaración de importación en el código, tales como:

import com.android.internal.telephony.Call; 
import com.android.internal.telephony.CallStateException; 
import com.android.internal.telephony.CallerInfo; 
import com.android.internal.telephony.CallerInfoAsyncQuery; 
import com.android.internal.telephony.Connection; 
import com.android.internal.telephony.MmiCode; 
import com.android.internal.telephony.Phone; 

Y, si añado estas importaciones en mi código, habrá demasiados errores, tales como :
The import com.android.internal.telephony cannot be resolved.

¿Cuál es la manera correcta y simple para mi problema?

+0

ver el enlace: [http://mylifewithandroid.blogspot.com/2008/01/phonecalls.html](http://mylifewithandroid.blogspot. com/2008/01/llamadas telefónicas.html) –

Respuesta

1

Añadir la categoría "android.intent.category.DEFAULT" (Intent.CATEGORY_DEFAULT)

+0

¡Gracias, MasterGaurav! Pero ya he agregado la categoría "android.intent.category.DEFAULT" en el archivo de manifiesto. Aquí está el código: \t \t \t Por eso me pregunto que hay otras razones . – Armstrong

+0

Quise agregar categoría predeterminada en el Intent en el código. –

1

La intención android.intent.action.ANSWER es de alguna manera no funciona como se esperaba. Hay una solución al emular el botón bluetooth para responder a la llamada entrante. Puede ver un ejemplo del proyecto auto-answer.

0

Debe crear un receptor de difusión en el que recibirá el evento cuando su teléfono esté sonando y después de que pueda iniciar la actividad deseada. No puede reemplazar la pantalla predeterminada de llamadas entrantes hasta que use la ROM PERSONALIZADA. Y no se olvide de establecer la prioridad en el receptor de difusión en el archivo de manifiesto. Una vez que obtenga el evento, puede usar el objeto de ITelephony utilizando el reflejo. Y eso puede proporcionarle métodos para responder o rechazar la llamada.

0

Esto es posible usando el paquete com.android.internal.telephony, pero debe encontrar alguna forma de utilizar este método en eclipse y su aplicación debe compilarse como una aplicación del sistema que utiliza el código fuente de Android.

0

cambiar su método de aceptación de llamada por esto:

public static void acceptCall(Context context) 
{ 
    Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON); 
    buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, 
     new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK)); 
    context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED"); 
} 
Cuestiones relacionadas