Avec quel niveau d'API travaillez-vous ? S'il est >= 11, consultez la nouvelle fonction BroadcastReceiver.goAsync qui vous permet d'étendre le traitement de la diffusion en dehors de la fonction onReceive de votre récepteur. Cela pourrait vous éviter d'avoir à faire une boucle.
Si, comme moi, vous êtes coincé avant le niveau 11, sachez qu'il est étonnamment difficile d'y parvenir de manière élégante. Vous l'avez peut-être déjà fait, mais j'ai essayé d'inclure un drapeau "processed" dans l'intention ACTION_CALL générée par mon code, en espérant qu'il serait inclus dans l'émission ACTION_NEW_OUTGOING_CALL qui en résulterait, mais cela ne fonctionne malheureusement pas.
La meilleure solution que j'ai trouvée consiste à inclure un fragment dans l'URI de l'intention ACTION_CALL que vous générez. Ce fragment sera inclus dans l'émission ACTION_NEW_OUTGOING_CALL qui en résulte, de sorte que le récepteur de l'émission puisse faire la différence entre l'appel original et celui que vous générez, mais il n'interférera pas avec les gestionnaires qui ne le recherchent pas.
Voici le code de base.
Dans votre BroadcastReceiver pour l'ACTION_NEW_OUTGOING_CALL
public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// extract the fragment from the URI
String uriFragment = Uri.parse(
intent.getStringExtra("android.phone.extra.ORIGINAL_URI")).getFragment();
// if the fragment is missing or does not have your flag, it is new
if (uriFragment == null || !uriFragment.contains("your_flag")) {
// launch your activity, pass the phone number, etc.
// use getResultData to get the number in order to respect
// earlier broadcast receivers
...
// abort the broadcast
this.setResultData(null);
this.abortBroadcast();
}
// otherwise, your code is there, this call was triggered by you
else {
// unless you have a special need, you'll probably just let the broadcast
// go through here
// note that resultData ignores the fragment, so other receivers should
// be blissfully unaware of it
}
}
}
Lorsque l'utilisateur compose le numéro pour la première fois, soit le fragment n'est pas présent, soit votre drapeau n'est pas présent, ce qui vous permet d'interrompre la diffusion et de commencer votre activité. Dans votre activité, si vous décidez de passer à nouveau l'appel, faites quelque chose comme ce qui suit :
startActivity(new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + modified_number + "#your_flag")));
Le fragment "your_flag" sera alors présent dans l'émission NEW_OUTGOING_CALL suivante et vous permettra ainsi de traiter ce cas différemment dans votre récepteur d'émission.
Ce qui est bien, c'est que le fragment est complètement ignoré à moins que vous ne le recherchiez dans l'ORIGINAL_URI, de sorte que d'autres récepteurs de diffusion peuvent continuer à fonctionner. Si vous voulez être vraiment gentil, vous pouvez rechercher un fragment existant et y ajouter votre drapeau (éventuellement avec une virgule de séparation).
J'espère que cela vous aidera. Je vous souhaite bonne chance !