web-dev-qa-db-fra.com

Obtenir l'ID de l'appelant dans Android 9

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.

12
haris

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 .

16
haris

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é

1
Obakeng Balatseng