Estou tentando criar um aplicativo como, quando uma ligação chegar, quero detectar o número. Abaixo está o que eu tentei, mas não está detectando chamadas recebidas.
Quero executar o meu MainActivity
plano de fundo, como posso fazer isso?
Eu tinha dado a permissão em manifest
arquivo.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Há mais alguma coisa que devo fornecer no manifesto?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Respostas:
Aqui está o que eu uso para fazer isso:
Manifesto:
Meu detector de chamadas reutilizável de base
Em seguida, para usá-lo, basta derivar uma classe e implementar algumas funções fáceis, independentemente do tipo de chamada que você gosta:
Além disso, você pode ver um artigo que eu fiz sobre o motivo pelo qual o código é como é no meu blog . Gist link: https://gist.github.com/ftvs/e61ccb039f511eb288ee
EDIT: Atualizado para um código mais simples, pois refiz a classe para meu próprio uso
fonte
lastState
não deve ser inicializado paraCALL_STATE_IDLE
. Estou faltando algumas chamadas quando meu aplicativo é interrompido enquanto o estado atual estáRINGING
. Porque, quando se tornaIDLE
novamente na chamada final, a variável estática é reinicializadaCALL_STATE_IDLE
e é rejeitada sem fazer nada. Então, perdemos a referêncialastState
.registrar
e cancelar o registro
fonte
Com o Android P - Api Nível 28: você precisa obter permissão READ_CALL_LOG
Acesso restrito aos registros de chamadas
Android P move os
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
, ePROCESS_OUTGOING_CALLS
permissões doPHONE
grupo de permissões para o novoCALL_LOG
grupo de permissões. Esse grupo oferece aos usuários melhor controle e visibilidade dos aplicativos que precisam acessar informações confidenciais sobre chamadas telefônicas, como ler registros de chamadas e identificar números de telefone.Para ler números da ação de intenção PHONE_STATE, você precisa da
READ_CALL_LOG
permissão e daREAD_PHONE_STATE
permissão . Para ler númerosonCallStateChanged()
, agora você precisaREAD_CALL_LOG
apenas da permissão. Você não precisa mais daREAD_PHONE_STATE
permissão.fonte
READ_CALL_LOG
emAndroidManifest.xml
foco na adição de uma solicitação de permissão noMainActivity
.ATUALIZAÇÃO: O código realmente impressionante publicado por Gabe Sechan não funciona mais, a menos que você solicite explicitamente que o usuário conceda as permissões necessárias. Aqui está um código que você pode colocar em sua atividade principal para solicitar essas permissões:
TAMBÉM: Como alguém mencionado em um comentário abaixo da postagem de Gabe , você deve adicionar um pequeno trecho de código
android:enabled="true
ao destinatário para detectar chamadas recebidas quando o aplicativo não está em execução no primeiro plano:fonte
isso pode ajudá-lo e também adicionar requer permissão
fonte
Apenas para atualizar a resposta de Gabe Sechan. Se o seu manifesto solicitar permissões para READ_CALL_LOG e READ_PHONE_STATE, o onReceive será chamado DUAS VEZES . Um deles possui EXTRA_INCOMING_NUMBER e o outro não. Você tem que testar qual o possui e pode ocorrer em qualquer ordem.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
fonte
Aqui está um método simples que pode evitar o uso
PhonestateListener
e outras complicações.Então, aqui estamos recebendo os 3 eventos do Android, como
RINGING
,OFFHOOK
eIDLE
. E, a fim de obter o possível estado de chamada, precisamos definir os nossos próprios estados comoRINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Ele pode lidar com todos os estados em uma chamada telefônica.Por favor, pense de uma maneira que estamos recebendo eventos do Android e definiremos nossos estados de plantão. Veja o código.
fonte
@ Gabriel Sechan, obrigado pelo seu código. Funciona bem, exceto o
onOutgoingCallEnded()
. Isso nunca é executado. Os telefones de teste são o Samsung S5 e Trendy. Existem 2 erros, eu acho.1: falta um par de colchetes.
2:
lastState
não é atualizado pelostate
se estiver no final da função. Ele deve ser substituído na primeira linha desta função porEu coloquei
lastState
esavedNumber
compartilhei as preferências como você sugeriu.Apenas testei com as alterações acima. Bug corrigido pelo menos nos meus telefones.
fonte
Por favor, use o código abaixo. Isso ajudará você a obter o número recebido com outros detalhes da chamada.
activity_main.xml
MainActivity.java
e em sua solicitação de manifesto para as seguintes permissões:
fonte
Você precisa de um BroadcastReceiver para
ACTION_PHONE_STATE_CHANGED
Isso ligará para o seu recebido sempre que o estado do telefone mudar de inativo, tocando e fora do valor anterior e do novo valor que você pode detectar se for uma chamada de entrada / saída.A permissão necessária seria:
Mas se você também deseja receber o EXTRA_INCOMING_NUMBER nessa transmissão, precisará de outra permissão: "android.permission.READ_CALL_LOG"
E o código mais ou menos assim:
e na classe receiver, podemos obter o estado atual lendo a intenção da seguinte forma:
o resultado de extras pode ser:
Com a transmissão PHONE_STATE, não precisamos usar a permissão PROCESS_OUTGOING_CALLS ou a ação NEW_OUTGOING_CALL descontinuada.
fonte