Je vois beaucoup de questions qu'il est impossible de mettre fin à un appel par programme dans Android ..__ En même temps, je vois beaucoup d'applications de numérotation sur Google Play où vous pouvez activer l'appel et le laisser tomber. Comment travaillent-ils?
Edit : J'ai lu quelque part que mon application doit être une application système. Alors comment le rendre système, et quelle est la différence entre les applications système et les applications utilisateur?
Vous n'avez pas besoin d'être une application système. Commencez par créer le package com.Android.internal.telephony
dans votre projet et placez-le dans un fichier appelé "ITelephony.aidl
":
package com.Android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
Une fois que vous avez cela, vous pouvez utiliser ce code pour mettre fin à un appel:
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();
Vous pouvez utiliser cela dans un PhoneStateListener, par exemple. Pour que cela fonctionne, vous avez besoin d'autorisations dans le manifeste:
<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" />
Edit: Toutes mes excuses pour la mise en forme horrible, je ne peux toujours pas comprendre comment faire correctement des blocs de code ici:/
Pour Android P (à partir de la version 2), il existe enfin une API formelle pour endCall:
https://developer.Android.com/reference/Android/telecom/TelecomManager#endCall ()
La permission ANSWER_PHONE_CALLS
est requise dans le manifeste:
<uses-permission Android:name="Android.permission.ANSWER_PHONE_CALLS" />
Avec l'autorisation, pour les API de niveau 28 ou supérieur:
TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
if (tm != null) {
boolean success = tm.endCall();
// success == true if call was terminated.
}
En même temps, la méthode endCall()
d'origine sous TelephonyManager
est maintenant protégée par l'autorisation MODIFY_PHONE_STATE
et ne peut plus être invoquée par des applications non système par réflexion sans autorisation (sinon une exception de sécurité sera déclenchée).
Outre l'ajout d'une interface de téléphonie Android et d'un récepteur de diffusion, vous devrez également ajouter une entrée de récepteur de manifeste Android avec l'action Android.intent.action.PHONE_STATE
pour le récepteur que vous souhaitez gérer.
Vous obtiendrez une erreur de compilation si vous ajoutez
uses-permission Android:name="Android.permission.MODIFY_PHONE_STATE`
dans votre fichier manifeste. Mais même si nous supprimons cela, il rejette automatiquement les appels entrants.
Pour information.
Peut être utile dans certaines situations. Il existe une solution de contournement possible à l'aide de la classe InCallService
. La plupart des informations requises se trouvent ici. https://developer.Android.com/reference/Android/telecom/InCallService.html#onCallRemoved(Android.telecom.Call)
Pour cela, vous devez définir votre application comme application téléphonique par défaut et vous assurer que les conditions suivantes sont respectées.
<uses-permission Android:name="Android.permission.CALL_PHONE" />
Si vous implémentez votre propre classe en étendant InCallService
, alors, lorsqu'un appel commence, l'appel est lié à votre application et vous obtenez les informations sur l'appel via la fonction onCallAdded()
. Vous pouvez alors simplement call.disconnect()
et l'appel se terminera.
SilenceRinger()
ne fonctionne pas pour les versions Android 2.3+. Juste commentez-le, les autres codes fonctionneront très bien . J'espère que cela fonctionne pour vous!
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;
}