¿Con qué nivel de API estás trabajando? Si es> = 11, consulte la nueva función BroadcastReceiver.goAsync que le permite extender el procesamiento de la transmisión fuera de la función onReceive de su receptor. Esto podría pasar por alto la necesidad de unir por completo.
Si, como yo, estás atrapado tratando de hacer esto antes del nivel 11, es sorprendentemente complicado hacerlo con elegancia. También puede haber hecho esto, pero traté de incluir una bandera "procesada" como extra en el intento de ACTION_CALL generado por mi código, con la esperanza de que de alguna manera se incluyera en la transmisión ACTION_NEW_OUTGOING_CALL resultante, pero lamentablemente eso no funciona.
La mejor solución que he podido encontrar es incluir un fragmento en el URI para el intento de ACTION_CALL que generas. Este fragmento se incluirá para la transmisión ACTION_NEW_OUTGOING_CALL resultante, por lo que su receptor de difusión puede diferenciar entre la llamada original y la que genera, pero no interferirá con los controladores que no la estén buscando.
Aquí está el código básico.
En su BroadcastReceiver para la 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
}
}
}
Cuando el primer usuario marca el número, el fragmento, o bien faltar por completo o su bandera no estará presente, por lo que abortar la emisión y puesta tu actividadEn su actividad, si decide realizar la llamada de nuevo, hacer algo como lo siguiente:
startActivity(new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + modified_number + "#your_flag")));
El fragmento "your_flag" A continuación tendrá presente en la posterior emisión NEW_OUTGOING_CALL y por lo tanto permite que usted resuelva este caso de manera diferente en tu receptor de emisión
Lo bueno de esto es que el fragmento se ignora por completo a menos que lo busque en ORIGINAL_URI, por lo que otros receptores de difusión pueden seguir funcionando. Si quieres ser realmente agradable, puedes buscar un fragmento existente y agregarle tu bandera (quizás con un separador de coma).
Espero que ayude. ¡Buena suerte!
duplicado: http://stackoverflow.com/q/808645/165674 –