Android: interrompi il loop di eventi NEW_OUTGOING_CALL?
Domanda
Ho un BroadcastReceiver
che cattura ACTION_NEW_OUTGOING_CALL
.
Nel metodo onReceive ()
invio il numero fornito a un nuovo ListActivity
, dove l'utente può scegliere vari nuovi numeri di destinazione da un elenco.
Quando l'utente seleziona un nuovo numero dall'elenco, sto iniziando un nuovo ACTION_CALL
con il nuovo numero nel campo URI. In alternativa, il risultato potrebbe essere il numero originale.
Qualunque sia il nuovo numero, deve essere composto immediatamente e non elaborato ulteriormente.
Come posso far sapere a BroadcastReceiver
che questo numero risultante non dovrebbe essere elaborato di nuovo?
Soluzione
L'ho risolto implementando un "Bypass Prefix" nel mio BroadcastReceiver
. Se la mia app client vuole chiamare direttamente un numero, semplicemente antepone il prefisso prima di invocare l'intento ACTION_CALL
.
Se il numero composto ha il prefisso (hardcoded), BroadcastReceiver
rimuove il prefisso e consente alla chiamata di procedere normalmente:
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) {
String number = getResultData();
if (number.startsWith(BYPASS_PREFIX)) {
setResultData(number.substring(BYPASS_PREFIX.length()));
} else {
// do additional processing
}
}
}
Ciò risolve due problemi in una volta sola: non solo questo interrompe il loop delle chiamate, ma mi dà anche un modo per aggirare l'elaborazione aggiuntiva per numeri specifici memorizzando il prefisso nelle voci della rubrica.
Altri suggerimenti
Il metodo onReceive () nel ricevitore Broadcast riceve un Intent come argomento. Estrai il Bundle dall'Intent usando Intent.getExtras (). Questo pacchetto contiene 3 coppie chiave-valore come segue:
- android.phone.extra.ALREADY_CALLED = null
- android.intent.extra.PHONE_NUMBER = 98xxxxxx98
- android.phone.extra.ORIGINAL_URI = tel: 98xxxxxx98
98xxxxxx98 è il numero composto dall'utente.
Quando si chiama nuovamente onReceive (), questo numero cambia in 98xxxxxx98 * o 0 * Controllando l'asterisco (*) alla fine del numero composto, si può dedurre se il metodo onReceive () viene chiamato per la prima volta o le successive successive.