¿Cómo aceptar una llamada entrante haciendo clic en un botón?
Estoy tratando de implementar mi propia llamada de teléfono de manejo de la interfaz de usuario.
Lo que quiero hacer es, si llega una llamada, el número de teléfono entrante y una imagen se muestran, y, si presiono un botón, la llamada entrante será aceptada / contestada.
- ¿Cómo realizar una llamada telefónica con intención en Android?
- ¿Cómo puedo hacer una llamada telefónica en android y volver a mi actividad cuando se realiza la llamada?
- Reenvío de llamadas
- ¿Qué información puedo obtener durante una llamada telefónica utilizando la API de Android?
- Cómo obtener el número de teléfono mediante el registro de llamadas de android?
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. Al principio, se produce una excepción si presiono mi botón de respuesta:
ActivityNotFoundException: Ninguna actividad encontrada para manejar Intent {
Act = android.intent.action.ANSWER
Entonces agregué una entrada en el AndroidManifest.xml:
<uses-permission android:name="android.permission.CALL_PHONE" />
Ejecuto la aplicación de nuevo, ya no hay 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), la llamada entrante es aceptada y un icono verde en llamada también se muestra 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 Phone en la fuente android. Hay un método como acceptCall () en la clase Phone. Pero estos códigos me parecen difíciles de usar, porque hay muchas declaraciones de importaciones 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 agrego estas importaciones en mi código, habrá demasiados errores, como:
The import com.android.internal.telephony cannot be resolved
.
¿Cuál es la manera correcta y sencilla para mi problema?
- Android: Receptor de llamadas entrantes sin permiso
- Listener para el final de la llamada en Android
- Cómo saber a callee se contesta la llamada (¿Cuál es el estado del teléfono cuando levanta la llamada)
- Aplicación de marcador de Android
- ¿Cómo hacer una llamada telefónica mediante programación?
- Llamada de Android con archivo de voz de voz personalizado
- ¿Cómo puedo llamar al número de emergencia mediante programación
- Cómo contestar una llamada mediante programación
Agregue la categoría " android.intent.category.DEFAULT
" ( Intent.CATEGORY_DEFAULT
)
La intención android.intent.action.ANSWER
es de alguna manera no funciona como se esperaba. Hay una solución alternativa al emular el botón bluetooth para contestar la llamada entrante. Puede ver un ejemplo del proyecto de respuesta automática .
Debe crear un receptor de difusión en el que obtendrá el evento cuando su teléfono esté sonando y después de que pueda iniciar su actividad deseada. No puede reemplazar la pantalla de llamada entrante predeterminada hasta que utilice la ROM PERSONALIZADA. Y no olvide establecer la prioridad en el receptor de difusión en el archivo de manifiesto. Una vez que se obtiene el evento se puede utilizar el objeto de ITelephony mediante la reflexión. Y que puede proporcionar métodos para responder o rechazar la llamada.
Esto es posible con el paquete com.android.internal.telephony
, pero hay que encontrar de alguna manera para usar estos métodos en eclipse y su aplicación tiene que ser compilada como una aplicación del sistema utilizando el código fuente android.
Cambie su método de llamada de aceptación 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"); }
- Android: No se puede establecer el fondo de VideoView a transparente
- Android: Fusionar / concatenar dos archivos de audio cuelga la aplicación