Android - parar eventos NEW_OUTGOING_CALL de looping?
Pergunta
Eu tenho um BroadcastReceiver
captura eventos ACTION_NEW_OUTGOING_CALL
.
No método onReceive()
Estou enviando o número fornecido para uma nova ListActivity
, onde o usuário começa a escolher vários números de destino novos a partir de uma lista.
Quando o usuário seleciona um novo número a partir da lista Estou em seguida, iniciar um novo ACTION_CALL
intenção com o novo número no campo URI. Alternativamente, o resultado pode ser o número original.
Seja qual for o novo número é, tem que ser marcado imediatamente e não processados ??ainda mais.
Como posso deixar o know BroadcastReceiver
que este número resultante não deve ser processado mais uma vez?
Solução
Eu resolvi isso implementando um "Bypass Prefixo" na minha BroadcastReceiver
. Se meu aplicativo cliente quer chamar um número diretamente simplesmente anexa o prefixo antes de invocar o ACTION_CALL
Intenção.
Se o número marcado tem o prefixo (hard coded), o BroadcastReceiver
retira o prefixo e permite que a chamada para proceder como normal:
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
}
}
}
Isso resolve dois problemas de uma só vez -. Não só este parada a chamada looping, ele também me dá uma maneira de contornar o processamento adicional para números específicos, armazenando o prefixo em suas entradas do livro de telefone
Outras dicas
O método OnReceive () no receptor Transmissão recebe um Intent como um argumento. Extraia o pacote de A intenção usando Intent.getExtras (). Este pacote contém 3 pares de valor-chave da seguinte forma:
- android.phone.extra.ALREADY_CALLED = null
- android.intent.extra.PHONE_NUMBER = 98xxxxxx98
- android.phone.extra.ORIGINAL_URI = tel: 98xxxxxx98
98xxxxxx98 é o número discado pelo usuário.
Quando o OnReceive () é chamado novamente, este número muda para 98xxxxxx98 * ou 0 * Verificando o asterisco (*) no final do número discado, pode-se inferir se o método OnReceive () é chamado pela primeira vez ou os próximos tempos posteriores.