Я знаю, что это заданный вопрос. Используя широковещательный приемник и используя android.intent.action.PHONE_STATE
в теге приемника вы можете узнать действия телефона. Но как я могу определить, является ли он входящим или исходящим?
вот мой код
@Override
public void onReceive(Context context, Intent intent)
{
this.context = context ;
System.out.println(":::called onReceiver:::");
TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);
}
private final PhoneStateListener phoneCallListener = new PhoneStateListener()
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
switch(state)
{
case TelephonyManager.CALL_STATE_RINGING:
isRinging = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if (isRinging)
{
hasAttended = true ;
isRinging = false;
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (hasAttended)
{
isCallEnded = true ;
hasAttended = false;
}
break;
}
if(isCallEnded)
{
isCallEnded=false;
Intent callIntent = new Intent(context.getApplicationContext(),MyActivity.class);
callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(callIntent);
}
super.onCallStateChanged(state, incomingNumber);
}
};
здесь каждый раз, когда создается объект phoneCallListener и каждый раз увеличивает скорость вызова onCallStateChanged на единицу.
Это удобный учебник, в котором используется как широковещательный приемник, так и файл android.intent.action.PHONE_STATE, который создает разные тосты для отображения в зависимости от состояния вызовов. Когда вы получите эту работу, вы сможете манипулировать кодом, чтобы делать то, что вы хотите, когда звонок является входящим или исходящим
Сначала ваш класс должен extend BroadcastReceiver
Затем вам нужно создать метод, который будет прослушивать состояние телефонов... PhoneStateListener
который будет слушать, когда изменяется состояние телефона
Затем выполните простой switch case
чтобы поймать вызов в зависимости от того, является ли он входящим вызовом или исходящим вызовом
РЕДАКТИРОВАТЬ
Все, что вам нужно сделать, это написать код, чтобы проверить, было ли предыдущее состояние "звонить". Если текущее состояние неактивно, а предыдущее состояние звонит, они отменили/пропустили вызов. Если текущее состояние отключено и предыдущее состояние звонит, они ответили на звонок.
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.i(LOG_TAG, "RINGING");
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(LOG_TAG, "OFFHOOK");
if (!wasRinging) {
// Start your new activity
} else {
// Cancel your old activity
}
// this should be the last piece of code before the break
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(LOG_TAG, "IDLE");
// this should be the last piece of code before the break
wasRinging = true;
break;
}