use um PhoneStateListener para ver quando a chamada termina. provavelmente será necessário acionar as ações do ouvinte para aguardar o início da chamada (aguarde até que seja alterado de PHONE_STATE_OFFHOOK para PHONE_STATE_IDLE novamente) e, em seguida, escreva um código para trazer seu aplicativo de volta ao estado IDLE.
pode ser necessário executar o ouvinte em um serviço para garantir que ele permaneça ativo e seu aplicativo seja reiniciado. algum código de exemplo:
EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
Definição do ouvinte:
private class EndCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(TelephonyManager.CALL_STATE_RINGING == state) {
Log.i(LOG_TAG, "RINGING, number: " + incomingNumber);
}
if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
//wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
Log.i(LOG_TAG, "OFFHOOK");
}
if(TelephonyManager.CALL_STATE_IDLE == state) {
//when this state occurs, and your flag is set, restart your app
Log.i(LOG_TAG, "IDLE");
}
}
}
No seu Manifest.xml
arquivo, adicione a seguinte permissão:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Trata-se da pergunta feita pela Starter.
O problema com o seu código é que você não está passando o número corretamente.
O código deve ser:
Não se esqueça de adicionar a permissão no arquivo de manifesto.
ou
para o número de emergência, caso
DIAL
seja usado.fonte
Tivemos o mesmo problema e conseguimos resolvê-lo usando a
PhoneStateListener
para identificar quando a chamada é encerrada, mas, além disso, precisávamosfinish()
da atividade original antes de iniciá-la novamentestartActivity
, caso contrário, o log de chamadas estaria à sua frente.fonte
Eu achei o EndCallListener o exemplo mais funcional, para obter o comportamento descrito (finish (), chamar, reiniciar). Adicionei algumas SharedPreferences para que o Listener tivesse uma referência para gerenciar esse comportamento.
My OnClick, initialize e EndCallListener respondem apenas às chamadas do aplicativo. Outras chamadas ignoradas.
adicione-os ao strings.xml
e algo assim em seu manifesto, se você precisar retornar à aparência antes da chamada
e coloque-os no seu 'myActivity'
use isso para iniciar o comportamento do seu onClick em myActivity, por exemplo, após onCreate ()
Você deve descobrir que clicar em sua lista de números de telefone encerra sua atividade, faz a ligação para o número e retorna à sua atividade quando a ligação é encerrada.
Fazer uma chamada de fora do seu aplicativo enquanto ele ainda estiver por perto não reiniciará a sua atividade (a menos que seja o mesmo que o último número BParty chamado).
:)
fonte
você pode usar startActivityForResult ()
fonte
Esta é a solução do meu ponto de vista:
Obviamente, na definição de atividade (classe), você precisa implementar o View.OnClickListener.
fonte
Aqui está o meu exemplo: primeiro, o usuário pode escrever o número que deseja discar, pressionar um botão de chamada e ser direcionado para o telefone. Após o cancelamento da chamada, o usuário é enviado de volta ao aplicativo. Para isso, o botão precisa ter um método onClick ('makePhoneCall' neste exemplo) no xml. Você também precisa registrar a permissão no manifesto.
Manifesto
Atividade
XML
fonte
fonte
Se você for usar um ouvinte, precisará adicionar essa permissão também ao manifesto.
fonte
Dentro do PhoneStateListener depois de ver a chamada terminar, use melhor:
Onde CallDispatcherActivity é a atividade em que o usuário iniciou uma chamada (para um despachante de serviço de táxi, no meu caso). Isso apenas remove o aplicativo de telefonia Android da parte superior, o usuário retorna em vez do código feio que eu vi aqui.
fonte
((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE);
Intent intentRestart = new Intent(ControlPanel.this, ControlPanel.class);
. Devo salientar que o PhoneStateListener também está no ControlPanel. Ou seja, meu objetivo é restaurar a interface do usuário para o estado em que estava antes de iniciar a ligação. Alguma sugestão?Para retornar ao seu
Activity
, você precisará ouvirTelephonyStates
. Nesse caso,listener
você pode enviar umIntent
para reabrir o seuActivity
quando o telefone estiver ocioso.Pelo menos é assim que eu vou fazer.
fonte
fonte
Tente usar:
no final da atividade. Ele o redirecionará para sua atividade anterior.
fonte
Quando
PhoneStateListener
é usado, é necessário garantir que aPHONE_STATE_IDLE
seguintePHONE_STATE_OFFHOOK
seja usada para acionar a ação a ser executada após a chamada. Se o gatilho acontecer ao verPHONE_STATE_IDLE
, você o fará antes da chamada. Porque você verá o estado mudarPHONE_STATE_IDLE -> PHONE_STATE_OFFHOOK -> PHONE_STATE_IDLE.
fonte
((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(new PhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE)
vai continuar a ouvir o estado do telefone e ser ativo até ser explicitamente interrompido com((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).listen(this, LISTEN_NONE)
// no setonclicklistener coloque este código:
// dê permissão para chamada no manifesto:
fonte
@Dmitri Novikov,
FLAG_ACTIVITY_CLEAR_TOP
limpa qualquer instância ativa em cima da nova. Portanto, ele pode encerrar a instância antiga antes de concluir o processo.fonte
Adicione este é o seu xml:
android:autoLink="phone"
fonte
Passos:
1) Adicione as permissões necessárias no
Manifest.xml
arquivo.2) Crie um ouvinte para as alterações de estado do telefone.
3) Inicialize o ouvinte no seu
OnCreate
mas se você deseja retomar o último estado do aplicativo ou trazê-lo de volta da pilha traseira , substitua
FLAG_ACTIVITY_CLEAR_TOP
porFLAG_ACTIVITY_SINGLE_TOP
Referenciar esta resposta
fonte
para obter mais referências, clique aqui http://androiddhina.blogspot.in/2015/10/how-to-make-phone-call-from-android.html
fonte
Ao iniciar sua chamada, ela fica bem.
No entanto, há uma diferença entre o Android 11+ e a versão mais recente, trazendo seu aplicativo para a frente.
Android 10 ou menos, você precisa iniciar uma nova intenção, Android 11+, basta usar
BringTaskToFront
No estado de chamada IDLE:
Eu defino o
MyActivity.MyActivityTaskId
quando faço a chamada da minha atividade dessa forma, isso não funciona, defina essa variável na página de atividades pai da página na qual você deseja voltar.MyActivityTaskId
é uma variável estática na minha classe de atividadeEspero que isso funcione para você. Eu uso o código acima de maneira um pouco diferente, abro meu aplicativo assim que a chamada é atendida para que o usuário possa ver os detalhes do chamador.
Eu configurei algumas coisas no
AndroidManifest.xml
também:e permissões:
Faça perguntas se ou quando você ficar preso.
fonte