0

我正在创建一个应用程序,只需要捕获来电。我为此和PhoneListnere类使用BroadCast类和Phone Listener类来捕获是否有传入呼叫。我的问题是,如果有任何传出的电话,我不希望我的应用程序被骚扰。即使有任何传出呼叫,我的广播类也会触发(尽管我正在整理退出应用程序的传出呼叫),但不喜欢这个应用程序实际上正在被激怒的想法。是否有任何特定的意图只是为了处理来电?仅捕获Android中的来电呼叫

回答

0

您可以使用ACTION_PHONE_STATE_CHANGED意图,并存储最后一个状态。如果当前状态为TelephonyManager.EXTRA_STATE_OFFHOOK,则存在正在拨号,处于活动状态或处于保持状态的呼叫。如果以前的状态是RINGING,那么这是一个来电。如果以前的状态是IDLE,那么这是一个传出呼叫。

以下接收机区分不同的方案:

public void onReceive(Context context, Intent intent) { 
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
    if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)){ 
     // Device call state: Ringing. A new call arrived and is ringing or waiting. In the latter case, another call is already active. 
     String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    }else if(state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK){ 
     // Device call state: Off-hook. At least one call exists that is dialing, active, or on hold, and no calls are ringing or waiting. 
     if(lastState.equals(TelephonyManager.EXTRA_STATE_IDLE){ 
      // outgoing call     
     } else if(lastState.equals(TelephonyManager.EXTRA_STATE_RINGING){ 
      // incoming call 
     } 
    }else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)){ 
     // Device call state: No activity. 
    } 
    lastState = state; 
} 
+0

<接收机机器人:名称= “com.droidapps.callspeaker.Speaker”> <意图滤波器> <操作机器人:名称=“android.intent .action.PHONE_STATE“/> .....这是我的清单,我正在使用您提到的意图,但即使您拨打电话,也会触发此意向。该Android网站还表示,它检测到电话状态的变化。我的意图是,如果有任何传出的电话,我的应用程序不应该被激怒。 –

+0

嗯,这似乎也是触发了传出呼叫,确实如此。你可以做什么也注册一个'android.intent.action.NEW_OUTGOING_CALL'意图的接收器。当发生这种情况时,存储某种变量。在“ACTION_PHONE_STATE_CHANGED”意图的onReceive()中,您可以检查传出是否在不久之前发生。 –

+0

更新:似乎工作的另一个解决方案是设置onReceive()中的最后一个状态;我用该代码更新了我的答案。 –