J'utilise le code suivant dans un BroadcastReceiver
pour obtenir l'ID de l'appelant des appels entrants:
@Override
public void onReceive(Context aContext, Intent aIntent) {
String action = aIntent.getAction();
if (action==null) return;
if (!action.equals("Android.intent.action.PHONE_STATE")) return;
String curState = aIntent.getStringExtra(TelephonyManager.EXTRA_STATE);
if ((TelephonyManager.EXTRA_STATE_RINGING.equals(curState))
&&(TelephonyManager.EXTRA_STATE_IDLE.equals(oldState)))){
String incNumber = aIntent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// do something here
}
oldState=curState;
}
Malheureusement, cela a cessé de fonctionner dans Android 9.0 (API 28)
. Plus précisément, aIntent.getStringExtra(EXTRA_INCOMING_NUMBER)
renvoie toujours null. Dans Android versions<=API 27
Tout fonctionne correctement
J'ai également ajouté les autorisations READ_PHONE_STATE
Et READ_CALL_LOG
Dans le fichier manifeste.
Des idées? Quelqu'un d'autre connaît le même problème?
Merci d'avance pour votre aide.
J'ai trouvé la réponse à ma question:
Premier arrivé Android 9
, vous devez explicitement demander à la fois READ_PHONE_STATE
et le READ_CALL_LOG
autorisations au moment de l'exécution. Dans les versions précédentes de Android, vous n'aviez qu'à demander le READ_PHONE_STATE
autorisation. Les deux doivent être demandés au moment de l'exécution.
Deuxièmement, si les deux autorisations ci-dessus ont été accordées, la méthode onReceive
est appelée deux fois (!!). La première fois que l'intention est "vide" (EXTRA_INCOMING_NUMBER
est nul). La deuxième fois, l'intention est normalement remplie comme il se doit. Ceci est documenté dans la Documentation TelephonyManager .
Ajouter READ_CALL_LOG
autorisation dans le manifeste comme ci-dessous:
<uses-permission Android:name="Android.permission.READ_CALL_LOG" />
Alors
Applications -> Votre application -> Autorisations -> Accorder l'autorisation des journaux d'appels
Vous devriez obtenir le numéro de téléphone maintenant, après la deuxième fois que votre receiver
est appelé