android - problemas - contestar llamadas con teclas de volumen
Finalizar llamada en Android programáticamente (5)
Junto con Agregar una interfaz de telefonía Android y un receptor de transmisión, también deberá agregar la entrada del receptor de manifiesto de Android con la acción android.intent.action.PHONE_STATE
para el receptor que desea manejar.
Obtendrá error de tiempo de compilación si agrega
uses-permission android:name="android.permission.MODIFY_PHONE_STATE`
en tu archivo de manifiesto Pero incluso si eliminamos esto, automáticamente rechaza las llamadas entrantes.
Veo muchas preguntas de que es imposible finalizar la llamada programáticamente en Android. Al mismo tiempo, veo muchas aplicaciones de marcador en el mercado de googleplay donde puedes activar la llamada y soltarla también. ¿Cómo trabajan?
Editar : He leído en alguna parte que mi aplicación tiene que ser una aplicación de sistema. Entonces, ¿cómo hacer que el sistema, y cuál es la diferencia entre el sistema y las aplicaciones de usuario?
Para Android P (desde Beta 2) y superior, finalmente hay una API formal para endCall:
https://developer.android.com/reference/android/telecom/TelecomManager#endCall()
Se ANSWER_PHONE_CALLS
permiso ANSWER_PHONE_CALLS
en manifiesto:
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
Con el permiso, para el nivel API 28 o superior:
TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
if (tm != null) {
boolean success = tm.endCall();
// success == true if call was terminated.
}
Al mismo tiempo, el método endCall()
original bajo TelephonyManager
ahora está protegido por el permiso MODIFY_PHONE_STATE
, y ya no puede ser invocado por aplicaciones que no sean del sistema por reflexión sin el permiso (de lo contrario se activará una excepción de seguridad).
SilenceRinger()
no funciona para las versiones de Android 2.3+. Solo coméntelo, otro código funcionará bien. ¡Espero que esto funcione para usted!
No necesita ser una aplicación de sistema. Primero, crea el paquete com.android.internal.telephony
en tu proyecto, y ponlo en un archivo llamado " ITelephony.aidl
":
package com.android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
Una vez que tenga eso, puede usar este código para finalizar una llamada:
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class clazz = Class.forName(telephonyManager.getClass().getName());
Method method = clazz.getDeclaredMethod("getITelephony");
method.setAccessible(true);
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);
telephonyService.endCall();
Podría usar esto dentro de un PhoneStateListener, por ejemplo. Para que esto funcione, necesita permisos en el manifiesto:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Editar: disculpas por el formato horrible, todavía no puedo entender cómo hacer bloques de código correctamente aquí: /
public static boolean isCallActive(Context context){
AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){
return true;
}
return false;
}