Android 跟踪来电操作

Android 跟踪来电操作,android,call,callstack,Android,Call,Callstack,我知道这是一个被问到的问题。通过使用广播接收机和 android.intent.action.PHONE\u状态 在receiver tag中,您可以了解手机的动作。但是,我如何识别这是一个传入呼叫还是传出呼叫 这是我的密码 @Override public void onReceive(Context context, Intent intent) { this.context = context ; System.out.println(":::called onRecei

我知道这是一个被问到的问题。通过使用广播接收机和 android.intent.action.PHONE\u状态

在receiver tag中,您可以了解手机的动作。但是,我如何识别这是一个传入呼叫还是传出呼叫

这是我的密码

@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_状态,根据调用状态创建不同的祝酒词。当你得到这个工作,你将能够操纵代码做什么,你想当一个电话是传入或传出

首先,您的班级必须
extend BroadcastReceiver

接下来,您必须创建一个方法来侦听电话状态
PhoneStateListener
当手机状态更改时,它将侦听

然后做一个简单的
switch case
,根据是呼入还是呼出来接听电话

编辑

您所需要做的就是编写一些代码来检查以前的状态是否为“ringing”。如果当前状态为空闲且前一状态为振铃,则他们取消/错过了呼叫。如果当前状态为offhook,而前一状态为ringing,则他们会接听电话

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;
    }
这是一个方便的教程,既使用广播接收器,也使用android.intent.action.PHONE_状态,根据呼叫状态创建不同的祝酒词。当你得到这个工作,你将能够操纵代码做什么,你想当一个电话是传入或传出

首先,您的班级必须
extend BroadcastReceiver

接下来,您必须创建一个方法来侦听电话状态
PhoneStateListener
当手机状态更改时,它将侦听

然后做一个简单的
switch case
,根据是呼入还是呼出来接听电话

编辑

您所需要做的就是编写一些代码来检查以前的状态是否为“ringing”。如果当前状态为空闲且前一状态为振铃,则他们取消/错过了呼叫。如果当前状态为offhook,而前一状态为ringing,则他们会接听电话

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;
    }

您好。我特别想知道在什么情况下您可以将其称为传入呼叫(非未接来电)。即,如果state=TelephonyManager.call\u state\u响铃,则该呼叫为传入呼叫,但如何确定该呼叫是否有人接听或未接。我的目标是显示一个弹出根据结果,我已经添加了更多的代码,以回答应该检查是否有人接听或错过了电话。。。您可以简单地向代码中添加一个toast,它将根据发生的情况弹出,并将您想要的信息放入toast中。谢谢。它起作用了。我已重写onCallStateChanged()。但是这个方法被调用了很多次…(将近九次)。你能解释一下原因吗?我得看看代码,看看你到底在做什么来正确解释它。。。。但是onCallStateChanged()正在使用BroadcastReceiver。因此,每当调用状态发生更改时,总是会调用onCallStateChanged()。因此,如果按照我上面添加的代码,我们有三种调用状态..TelephonyManager.call_STATE_IDLE..TelephonyManager.call_STATE_OFFHOOK..TelephonyManager.call_STATE_Ring。。所以实际上应该只有三个调用,而不是九个,但是我不能说为什么在没有查看代码的情况下它会被调用九次。。试着调试看看它被调用了多少次,当我说“试着调试看看它被调用了多少次”时,我的意思是看onCallStateChanged()方法被调用了多少次,因为如果它被呼叫了3次,那就是3x3=9,给你你指的是9。我特别想知道在什么情况下你可以说它是来电(不是未接来电)。也就是说,如果state=TelephonyManager.call\u state\u RINGING,那么呼叫是来电,但是如何确定呼叫是有人接听还是未接。我的目标是显示一个弹出根据结果,我已经添加了更多的代码,以回答应该检查是否有人接听或错过了电话。。。您可以简单地向代码中添加一个toast,它将根据发生的情况弹出,并将您想要的信息放入toast中。谢谢。它起作用了。我已重写onCallStateChanged()。但是这个方法被调用了很多次…(将近九次)。你能解释一下原因吗?我得看看代码,看看你到底在做什么来正确解释它。。。。但是onCallStateChanged()正在使用BroadcastReceiver。因此,每当调用状态发生更改时,总是会调用onCallStateChanged()。因此,如果按照我上面添加的代码,我们有三种调用状态..TelephonyManager.call_STATE_IDLE..TelephonyManager.call_STATE_OFFHOOK..TelephonyManager.call_STATE_Ring。。所以实际上应该只有三个调用,而不是九个,但是我不能说为什么在没有查看代码的情况下它会被调用九次。。试着调试看看它被调用了多少次,当我说“试着调试看看它被调用了多少次”时,我的意思是看方法onCallStateChanged()被调用了多少次,因为如果它被调用了3次,那么它将是3x3=9,给出你所引用的9to@juli-你解决这个问题了吗?@NilayOnAndroid是的。。。代码是有效的。。但是我为phoneStateListener创建了一个singleton类,以获取相同的实例并设置booleanflags@juli-你解决这个问题了吗?@NilayOnAndroid是的。。。代码是有效的。。但是我为phoneStateListener创建了一个singleton类,以获取相同的实例并设置布尔标志