我有一个应用程序可以在来电结束时做一些事情我有一个带有两个标志的电话状态监听器,仅用于检测已应答的收入电话并将电话号码存储到静态变量中,以在通话结束时使用电话响起时仅显示一个标志以仅检测收入,电话应答时仅显示一个标志以仅回答已回答的问题]
一切正常,但我发现如果在通话过程中有另一个来电,那么我的应用程序会充塞第二笔收入,即使拒绝也是如此
这是我的代码
public class ServiceReceiver extends BroadcastReceiver { static boolean is_incoming = false; static boolean in_call = false; //when incoming call ends check that call was answered public static String saved_number; //when call answers store number to use when ends static Context context; @Override public void onReceive(Context context, Intent intent) { ServiceReceiver.context = context; String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //when phone rings is_incoming = true; Toast.makeText(context, "ringing", Toast.LENGTH_SHORT).show(); } if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer in_call = true; saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); Toast.makeText(context, "offhook", Toast.LENGTH_SHORT).show(); } if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ // when reject or miss or ends if(in_call && is_incoming) { //answered incoming call ends doStuff(saved_number); } //making flags ready for next use in_call = false; is_incoming = false; } } }
[我发现,当第二个来电到达时,广播通过第二个电话号码以振铃状态发送,但是当拒绝时,android似乎在发送摘机广播的第二个电话!
我自己的想法是,如果in_call已经为true,则进入摘机状态(不执行任何操作(请勿更改保存的号码)所以我将摘机声明更改为此]
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer if(in_call){ Toast.makeText(context, "inside checking", Toast.LENGTH_SHORT).show(); //return; } saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); //Toast.makeText(context, "offhook for " + saved_number, Toast.LENGTH_SHORT).show(); in_call = true; }
但是我发现每次都会显示“内部检查”吐司,并且我使用
!in_call
而不是in_call
,而且魔术上没有任何变化并且如果取消注释返回应用程序崩溃现在我很困惑为什么!
请帮助
[我有一个应用程序在来电结束时做一些事情,我有一个带有两个标志的电话状态侦听器,它们只能检测已应答的收入电话并将电话号码存储到一个静态变量中,以便在通话时使用...
幸运的是我可以解决问题我只是将保存号码移到了响铃语句(并从摘机中删除),并且仅当当前不在通话中时才保存号码最终代码:
public class ServiceReceiver extends BroadcastReceiver {
static boolean is_incoming = false;
static boolean in_call = false; //when incoming call ends check that call was answered
public static String saved_number; //when call answers store number to use when ends
static Context context;
@Override
public void onReceive(Context context, Intent intent) {
ServiceReceiver.context = context;
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){ //when phone rings
is_incoming = true;
if(!in_call){
saved_number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Toast.makeText(context, "ringing by: " + saved_number, Toast.LENGTH_SHORT).show();
}
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){ //when incoming call answer
in_call = true;
Toast.makeText(context, "offhook", Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){ // when reject or miss or ends
if(in_call && is_incoming) { //answered incoming call ends
doStuff(saved_number);
}
//making flags ready for next use
in_call = false;
is_incoming = false;
}
}
}