0
我正在创建一个应用程序,只需要捕获来电。我为此和PhoneListnere类使用BroadCast类和Phone Listener类来捕获是否有传入呼叫。我的问题是,如果有任何传出的电话,我不希望我的应用程序被骚扰。即使有任何传出呼叫,我的广播类也会触发(尽管我正在整理退出应用程序的传出呼叫),但不喜欢这个应用程序实际上正在被激怒的想法。是否有任何特定的意图只是为了处理来电?仅捕获Android中的来电呼叫
我正在创建一个应用程序,只需要捕获来电。我为此和PhoneListnere类使用BroadCast类和Phone Listener类来捕获是否有传入呼叫。我的问题是,如果有任何传出的电话,我不希望我的应用程序被骚扰。即使有任何传出呼叫,我的广播类也会触发(尽管我正在整理退出应用程序的传出呼叫),但不喜欢这个应用程序实际上正在被激怒的想法。是否有任何特定的意图只是为了处理来电?仅捕获Android中的来电呼叫
您可以使用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;
}
<接收机机器人:名称= “com.droidapps.callspeaker.Speaker”> <意图滤波器> <操作机器人:名称=“android.intent .action.PHONE_STATE“/> intent-filter> .....这是我的清单,我正在使用您提到的意图,但即使您拨打电话,也会触发此意向。该Android网站还表示,它检测到电话状态的变化。我的意图是,如果有任何传出的电话,我的应用程序不应该被激怒。 –
嗯,这似乎也是触发了传出呼叫,确实如此。你可以做什么也注册一个'android.intent.action.NEW_OUTGOING_CALL'意图的接收器。当发生这种情况时,存储某种变量。在“ACTION_PHONE_STATE_CHANGED”意图的onReceive()中,您可以检查传出是否在不久之前发生。 –
更新:似乎工作的另一个解决方案是设置onReceive()中的最后一个状态;我用该代码更新了我的答案。 –